Правильный способ найти папку пользователя My Documents в Windows с Java?

По какой-то причине мне иногда нужно найти текущую папку "Мои документы" в Windows в программе Java для чтения некоторых файлов. Но, насколько я могу судить, нет никакого способа сделать это, что не сильно испорчено.

Первый неправильный путь: System.getProperty( "user.home" );
Почему это не сработает:

  • Он возвращает только \username\folder; Мне нужно добавить "\ Documents \" до конца, чтобы получить папку "Документы"... и это работает только на английском языке.
  • Sun-ошибки 6519127 и 4787931. Java находит домашнюю папку пользователя в Windows, читая устаревший раздел реестра *, чтобы найти Рабочий стол, затем родитель; этот метод имеет несколько известных проблем, которые могут привести к возврату полностью неправильной папки. Ошибки составляют 3,75 года и 8 лет без каких-либо исправлений.

Второй неправильный способ: использование программы для чтения реестра, чтобы получить личную папку пользователя, которая является My Documents (но i18n'd).
Почему это не будет работать:
Хотя он исправляет проблему только для английского языка, он все еще использует ту же самую устаревшую область реестра, поэтому к ней все еще применяются ошибки.

Устаревший раздел реестра говорит, что использует собственный вызов (SHGetKnownFolderPath), который я, очевидно, не могу сделать с Java.

Третий неправильный путь:

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

Почему это не сработает: он отлично работает!
За исключением случаев, когда этого не происходит. В то время как у меня была программа, которая использовала это открытое и работающее в фоновом режиме, я открыл игру DirectX (Fallout: New Vegas). Программа Java немедленно прекратилась без трассировки стека. Всегда воспроизводимый (для меня в этой игре, и кто знает, что еще). Не удалось найти ошибку Sun #.

Итак, есть ли способ найти папку "Документы пользователя" в Windows, с Java, которая не знает проблем?

(Это хороший большой вопрос.)

* (Ключ "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" )

Ответы

Ответ 1

Там нет чистого java-способа сделать это, но вы можете использовать JNA-обертку над JNI, чтобы сделать это без необходимости писать собственный код. Там хороший пример того, как получить папку "Документы" в Windows на полпути ответов:

Каков наилучший способ найти домашний каталог пользователей на Java?

Ответ 2

Много времени, но надежный способ найти папку "Документы" пользователя Windows: заставьте ваше приложение java выполнить bat script, который использует Reg.exe(системный файл Windows), чтобы найти значение reg ключ, в котором есть путь. Затем используйте конвейер в том же файле bat, чтобы отправить эти данные в функцию "findstr", которая имеет командную строку Windows. Используйте другой конвейер для вывода возвращаемого значения в текстовый файл. Затем просто сделайте свое приложение 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

Ответ 3

Существует специальный API Java, который кто-то создал (их веб-сайт больше не работает), но код Google остается в коде Google:

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

Есть две DLL, на которые нужно ссылаться, по одной для каждой архитектуры (x86 и x64).

Ответ 4

user.home не является "моими документами", а домашней папкой пользователей, например, в Unix ~/. Чтобы попасть в "Мои документы", вы можете использовать System.getProperty( "user.home" ) + "\ Documents"; независимо от языковой системы. Попробуйте.