使用Java在Windows上查找用户的My Documents文件夹的正确方法?

时间:2010-11-06 18:35:53

标签: java windows registry documents

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

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

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

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

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

第三种错误方式:

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

为什么它不起作用:效果很好!
除非它没有。虽然我有一个程序在后台使用这个开放和运行,我打开了一个DirectX游戏(辐射:新维加斯)。 Java程序立即终止,没有堆栈跟踪。总是可以重现的(对我来说,那个游戏,谁知道还有什么)。找不到太阳虫#。

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

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

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

4 个答案:

答案 0 :(得分:4)

没有纯粹的java方法可以做到这一点,但是您可以使用JNA包装器而不是JNI来完成它而无需自己编写任何本机代码。有一个很好的例子,说明如何在Windows的中途获取文档文件夹:

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

答案 1 :(得分:3)

查找Windows用户的“Documents”文件夹的一种耗时但可靠的方法:让您的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

答案 2 :(得分:0)

有人建立了一个自定义Java API(他们的网站不再有效),但Google Code上仍然存在代码:

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

需要引用两个DLL,每个架构一个(x86和x64)。

答案 3 :(得分:-1)

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