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

2022-09-04 22:57:20

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

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

  • 它只返回 \username\ 文件夹;我需要将“\Documents\”添加到末尾才能获得“文档”文件夹...这只适用于英语。
  • 太阳虫子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上找到用户的“文档”文件夹,该文件夹没有已知问题?

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

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


答案 1

没有纯java的方法可以做到这一点,但是你可以在JNI上使用JNA包装器来做到这一点,而不必自己编写任何本机代码。有一个很好的例子,说明如何在Windows上获取“文档”文件夹,在以下位置的响应中途:

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


答案 2

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

蝙蝠文件的代码:

@ echo off

Title Find Documents Folder

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

exit

推荐