java - 使用 Java 在 Windows 上查找用户的“我的文档”文件夹的正确方法?

标签 java windows registry documents

不知什么原因,我有时需要在Java程序中找到当前用户在Windows上的我的文档文件夹来读取一些文件。但据我所知,没有任何方法没有严重缺陷。

第一种错误方式:System.getProperty("user.home");
为什么它不起作用:

  • 它只返回\username\文件夹;我需要在末尾添加“\Documents\”才能获得 Documents 文件夹……这只适用于英语。
  • Sun bugs 6519127和 4787931。Java 通过读取已弃用的注册表项* 找到桌面然后获取父级,从而在 Windows 上找到用户主文件夹;该方法存在多个已知问题,很容易导致返回完全错误的文件夹。这些错误已有 3.75 年和 8 年历史,没有修复。

第二种错误方式:使用注册表读取程序获取用户的Personal文件夹,即My Documents(但i18n'd)。
为什么它不起作用:
虽然它修复了仅限英语的问题,但它仍在使用相同的已弃用注册表区域,因此错误仍然适用。

已弃用的注册表项表示要使用 native 调用 (SHGetKnownFolderPath),我显然无法从 Java 执行此操作。

第三种错误方式:

JFileChooser fr = new JFileChooser();  
FileSystemView fw = fr.getFileSystemView();  
File documents = fw.getDefaultDirectory();

为什么它不起作用:它很好用!
除非没有。当我有一个使用它的程序在后台打开并运行时,我打开了一个 DirectX 游戏(辐射:新维加斯)。 Java 程序立即终止,没有堆栈跟踪。总是可重现的(对我来说在那场比赛中,谁知道还有什么)。找不到 Sun bug#。

那么有没有什么方法可以在 Windows 上从 Java 中找到用户的文档文件夹,而且没有已知问题?

(这是一个很好的大问题。)

*(关键是“HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders”)

最佳答案

没有纯 Java 方法可以做到这一点,但您可以使用 JNI 上的 JNA 包装器来做到这一点,而不必自己编写任何 native 代码。有一个很好的例子,说明如何在 Windows 上的 Documents 文件夹中获取响应的一半:

What is the best way to find the users home directory in Java?

关于java - 使用 Java 在 Windows 上查找用户的“我的文档”文件夹的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4114543/

相关文章:

google-chrome - Chrome AutoSelectCertificateForUrls 主题过滤器

regex - 在 PowerShell 中,如果环境变量(如 $SystemRoot$)是字符串的一部分,我该如何转换它们?

java - 调试/优化java应用程序

java - 如何将 User 对象从一个 Controller 传递到不同的 JavaFX Controller ?

java - 收集所有发出的 SQL 的最简单方法

php - Magento - Mage 注册表项 "_resource_helper/core"已存在

java - 不同项目下的同一个包

c++ - std::u32string 与 std::string 和 std::u16string 之间的转换

windows - Log4Net 与 WCF 作为服务运行

javascript - F8 键可以在我的应用程序中的 javascript 和 windowForm 中使用吗?