我有一个显示JavaFX/OpenJFX FileChooser的应用程序,当用户选择一个文件时,它应该出现在OS最近的文件列表中,但它没有发生。
如何创建符号链接或将文件添加到操作系统最近文件中?
谢谢。
目前为止,这个答案涵盖了Windows
部分,希望这成为一个合作的答案,其他人填补了macOS
和Unix
缺失的部分:
主要结构:
public interface RecentDocsSaver {
void addToRecentDocs(File file);
}
public class RecentDocsSaverFactory {
private static final String OS_NAME = System.getProperty("os.name").toLowerCase();
private RecentDocsSaverFactory() {
}
public static RecentDocsSaver getOSInstance() {
if (isWindows()) {
return WindowsRecentDocsSaver.INSTANCE;
}
// TODO: add code for mac and unix
throw new UnsupportedOperationException(OS_NAME + " is not supported");
}
private static boolean isWindows() {
return OS_NAME.contains("win");
}
private static boolean isMac() {
return OS_NAME.contains("mac");
}
private static boolean isUnix() {
return OS_NAME.contains("nix") || OS_NAME.contains("nux") || OS_NAME.contains("aix");
}
}
:
我相信使用JNA
是正确的方式来添加文件到Windows
的最近列表(其他方式包括访问Windows注册表)。
Shell32
库提供了直接将文件添加到最近文件列表的功能。函数为SHAddToRecentDocs(flags, path)
。
public class WindowsRecentDocsSaver implements RecentDocsSaver {
public static final WindowsRecentDocsSaver INSTANCE = new WindowsRecentDocsSaver();
private WindowsRecentDocsSaver() {
}
public void addToRecentDocs(File file) {
if (file != null) {
WString unicodeStringPath = new WString(file.getPath());
// 3 is for null-terminated Unicode string
Shell32.INSTANCE.SHAddToRecentDocs(3, unicodeStringPath);
}
}
private interface Shell32 extends ShellAPI {
Shell32 INSTANCE = Native.loadLibrary("shell32", Shell32.class);
void SHAddToRecentDocs(int flags, WString file);
}
}
macOS:TODO
Unix:TODO
使用:
File recent = fileChooser.showOpenDialog(window);
if (recent != null) {
RecentDocsSaverFactory.getOSInstance().addToRecentDocs(recent);
}