13

无论出于何种原因,我有时需要在 Java 程序中找到当前用户在 Windows 上的 My Documents 文件夹来读取一些文件。但据我所知,没有任何方法可以做到不存在严重缺陷。

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

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

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

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

第三种错误方式:

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

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

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

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

*(密钥为“HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders”)

4

4 回答 4

4

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

在 Java 中查找用户主目录的最佳方法是什么?

于 2010-11-07T00:27:29.060 回答
3

查找 Windows 用户的“文档”文件夹的一种耗时但可靠的方法:让您的 Java 应用程序执行一个使用 Reg.exe(Windows 系统文件)的 bat 脚本来查找具有路径的 reg 键的值在里面。然后使用同一 bat 文件中的管道将该数据发送到 windows 命令提示符具有的“findstr”函数。使用另一个管道将返回的值输出到文本文件。然后,只需让您的 java 应用程序读取该文本文件,并在完成后将其删除 :) 对我来说已经足够好了。

bat文件的代码:

@ echo off

Title Find Documents Folder

Reg Query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" |findstr "Personal">>DocPath.dat

exit
于 2012-07-14T18:40:57.597 回答
0

有人构建了一个自定义 Java API(他们的网站不再工作),但代码仍保留在 Google 代码中:

http://winfoldersjava.googlecode.com/files/WinFoldersJava_1.1.zip

有两个 DLL 需要引用,每个体系结构(x86 和 x64)一个。

于 2010-11-06T18:43:04.243 回答
-1

user.home 不是“我的文档”,而是用户主文件夹,如 Unix ~/. 要访问“我的文档”,您可以使用 System.getProperty("user.home")+"\Documents"; 与语言系统无关。试试看。

于 2010-11-06T18:46:08.833 回答