2010-11-06 112 views
13

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

第一个错误的方法是:System.getProperty(“user.home”);
为什么它不会工作:

  • 它只返回\用户名\文件夹;我需要添加“\ Documents \”到最后才能得到Documents文件夹......并且只能用英文。
  • Sun bugs 6519127和4787931. Java通过阅读不赞成使用的注册表键*来查找桌面,然后获取父级;此方法有多个已知问题,很容易导致完全错误的文件夹被返回。错误是3.75年和8岁,没有修复。

第二个错误的方法:使用注册表读取程序来获取用户的个人文件夹,这是My Documents(但是i18n'd)。
为什么它不会工作:
虽然它修复了仅英文问题,但它仍然使用相同的已弃用的注册表区域,所以错误仍然适用于它。

不赞成使用的注册表键表示使用本机调用(SHGetKnownFolderPath),我显然无法从Java执行该调用。

第三种错误方式:

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

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

那么是否有任何方法可以在Windows上从Java找到用户的Documents文件夹,该文件夹没有已知问题?

(这是一个不错的大问题。)

*(关键是 “HKCU \软件\微软\的Windows \ CurrentVersion \ Explorer中\ Shell文件夹”)

+0

同[如何找到“我的文档”文件夹中 ](http://stackoverflow.com/questions/1503555/how-to-find-my-文档文件夹)。它提到了winfoldersjava,一个围绕SHGetSpecialFolderPath的JNI包装。由于您使用的是Windows特有的功能,因此JNI应该没问题。 – 2010-11-06 18:40:36

+1

你真的从第三种方式将这些崩溃隔离到代码段吗?因为这个方法似乎被Swings自己的打开文件对话框(JFileCHooser)使用,所以似乎很多Java应用程序都会遭受它? – 2011-03-21 14:59:41

+0

http://stackoverflow.com/questions/1503555/how-to-find-my-documents-folder – 2012-08-28 13:35:52

回答

-1

user.home不是“我的文档”,而是用户主文件夹,就像在Unix上的〜/。要访问“我的文档”,您可以使用System.getProperty(“user.home”)+“\ Documents”;不管语言系统如何。尝试一下。

+0

他已经表示,他需要多语言支持 - 这是行不通的。 – 2010-11-06 18:49:33

+0

即使没有英文问题,这也不起作用;正如我在我的问题中指出的那样,Java使用已弃用的注册表项来查找user.home。它可能会失败漫游配置文件,在XP-> Vista的升级,如果用户已经重命名他们的桌面文件夹等(部分修复可能已经交付,但它被全面破坏) – 2010-11-06 18:58:27

+0

请不要发布导致更多问题的答案比他们解决。 – 2011-08-17 17:17:43

3

一个耗时,但找到“文档”是Windows用户的文件夹的可靠的方法:使Java应用程序执行使用Reg.exe(Windows系统文件)的bat脚本来查找具有路径的注册表项的值。然后使用同一个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 
相关问题