Правильный способ найти пользовательскую папку «Мои документы» в Windows с Java? - PullRequest
13 голосов
/ 06 ноября 2010

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

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

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

Второй неправильный способ: использование программы чтения реестра, чтобы получить личную папку пользователя, которая является Моими документами (но 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")

Ответы [ 4 ]

4 голосов
/ 07 ноября 2010

Нет чистого Java-способа сделать это, но вы можете использовать JNA-оболочку поверх JNI, чтобы сделать это без необходимости написания собственного кода.Есть хороший пример того, как получить папку «Документы» в Windows на полпути ответов:

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

3 голосов
/ 14 июля 2012

Трудоемкий, но надежный способ поиска папки «Documents» пользователя Windows. Сделайте так, чтобы ваше Java-приложение выполняло скрипт bat, который использует Reg.exe (системный файл Windows), чтобы найти значение ключа reg, которыйесть путь в этом.Затем используйте конвейер в том же файле bat для отправки этих данных в функцию 'findstr', которая есть в командной строке Windows.Используйте другой конвейер для вывода возвращаемого значения в текстовый файл.Затем просто заставьте ваше Java-приложение прочитать этот текстовый файл и удалите его, как только оно будет готово :).

Код для файла летучей мыши:

@ echo off

Title Find Documents Folder

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

exit
0 голосов
/ 06 ноября 2010

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

0 голосов
/ 06 ноября 2010

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

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

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

...