如何在Java中找到“我的文档”文件夹

17

我想把文件保存在用户的“我的文档”文件夹中。

我尝试通过以下方式获取该位置:

System.getenv("USERPROFILE") + "\\My Documents\\"

后来我意识到,在语言设置为另一种语言,例如法语的系统中,这种方法不起作用。

有没有其他有效获取“我的文档”文件夹的方法?

5个回答

21

关于性能,这比使用JFileChooser更快:

FileSystemView.getFileSystemView().getDefaultDirectory().getPath()

在我的电脑上,使用JFileChooser方法需要300毫秒,而直接调用FileSystemView需要不到100毫秒。


17

如果你不介意依赖于Swing,那么显然可以使用以下技巧:

import javax.swing.JFileChooser;
javax.swing.filechooser.FileSystemView;

public class GetMyDocuments {
  public static void main(String args[]) {
     JFileChooser fr = new JFileChooser();
     FileSystemView fw = fr.getFileSystemView();
     System.out.println(fw.getDefaultDirectory());
  }
}

(来源:http://www.rgagnon.com/javadetails/java-0572.html)


2
对于 Mac OS X,使用它的结果实际上会高出一个目录。 - Hakanai
这指向一个不存在的文件夹... c:\Users<我的用户名>\Documents。我的系统上的文档文件夹叫做“我的文档”。 - JavaLatte
@JavaLatte 你确定那是实际的名称吗?即使目录名为“Documents”,资源管理器也会将其显示为“My Documents”。如果单击路径栏,您可以看到真实路径。 - Sean Van Gorder
1
@SeanVanGorder,你是对的:如果我打开一个命令窗口并进入该目录,它被称为“Documents”,但在资源管理器中它显示为“My Documents”。 - JavaLatte

7

有一个winfoldersjava JNI扩展可以在Java中访问特殊文件夹名称。

winfoldersjava页面还介绍了另一种使用Swing的方法:

此外,如果您只需要“My documents”路径并且不介意触摸Swing,则可能不需要WinFoldersJava。您可以使用javax.swing.filechooser.FileSystemView.getFileSystemView().getDefaultDirectory()。


1

该目录的位置可以由每个用户更改,因此不仅取决于区域设置。
要找到该文件夹的位置,您必须查看注册表。 执行此操作的Windows命令为:

reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User
Shell Folders" /v personal

或者

reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell 
Folders" /v personal

不确定实际位置是哪一个,但其中之一。


这些注册表项只有在调用Shell API中的其他程序之一后才会被创建。 - Sheng Jiang 蒋晟
此外,仅为了获取注册表值而运行子进程是相当过度的。这里有很多故障模式,如果例如注册表键不存在、不可访问或用户的公司安装了阻止“reg”运行的软件(正是我的工作场景),则无法获得适当的错误处理。 - toolforger

-1

1
"%CSIDL_PERSONAL%\doc.txt"会在Java中打开My Documents文件夹中的doc.txt文件,对吗? - Wander Nauta
可能会有用,但您的程序将不再是平台无关的。如上所建议,使用Swing FileSystemView技巧似乎更好,因为它可以跨平台工作,并且意味着您遵循其他Java应用程序相同的默认值(保持一致总是很好)。 - Stijn de Witt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接