Получение пути к моим документам в Java - PullRequest
23 голосов
/ 13 марта 2012

Мне нужно найти путь к моим документам, используя Java.Следующий код не дает мне «точную» лояльность

System.getProperty("user.home");

Что должно быть наоборот?

PS: я не хочу использоватьJFileChooser Грязный трюк.

Ответы [ 8 ]

29 голосов
/ 18 сентября 2012

Это просто, JFileChooser находит это для вас

new JFileChooser().getFileSystemView().getDefaultDirectory().toString();

Надеюсь, это кому-нибудь поможет

21 голосов
/ 10 октября 2015

Так как в наиболее популярном ответе @xchiltonx используется JFileChooser Я хотел бы добавить, что в отношении производительности это быстрее , чем при использовании JFileChooser:

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

Вмоему компьютеру, JFileChooser для доступа требовалось 300 мс, а для вызова FileSystemView напрямую требовалось менее 100 мс.

Примечание : Вопрос является возможной копией Как найти «МойДокументы »в Java

9 голосов
/ 13 марта 2012

Вы можете получить его, используя запрос в реестре, для этого не нужны JNA или права администратора.

Runtime.getRuntime().exec("reg query \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell 
Folders\" /v personal");

Очевидно, что это не сработает ни на чем, кроме Windows, и я не уверен, работает ли это для Windows XP.

EDIT: Поместите это в рабочую последовательность кода:

String myDocuments = null;

try {
    Process p =  Runtime.getRuntime().exec("reg query \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\" /v personal");
    p.waitFor();

    InputStream in = p.getInputStream();
    byte[] b = new byte[in.available()];
    in.read(b);
    in.close();

    myDocuments = new String(b);
    myDocuments = myDocuments.split("\\s\\s+")[4];

} catch(Throwable t) {
    t.printStackTrace();
}

System.out.println(myDocuments);

Обратите внимание, что это заблокирует процесс до тех пор, пока не будет выполнен запрос "reg", что может вызвать проблемы в зависимости от того, что вы делаете.

2 голосов
/ 30 октября 2013

Используя JNA, вы можете сделать следующее:

String myDocsPath = Shell32Util.getFolderPath(ShlObj.CSIDL_PERSONAL);

JNA извлекает DLL на лету, а затем использует JNI с этой DLL для выполнения вызовов Windows API.Это скрывает все детали JNI от вас, хотя.Использовать JNA так же просто, как и любую другую библиотеку JAV JAR.

1 голос
/ 13 марта 2012

"user.home" возвращает домашний каталог пользователя, а не папку «Мои документы».В Windows это будет «C: \ Users \ Имя пользователя \» для Vista или 7 или «C: \ Documents and Settings \ Имя пользователя» для XP

. Что вы хотите:

System.out.println(System.getProperty("user.home") + File.separatorChar + "My Documents");
0 голосов
/ 24 декабря 2018

Лучший способ, который я нашел, - это использовать AWT:

ShellFolder.get("fileChooserDefaultFolder");

Я перенаправил свою папку «Документы» на диск D: и он успешно извлекает этот каталог. Это также происходит примерно за 40 мс (на моей машине). Использование FileSystemView занимает около 48 мс, а new JFileChooser() около 250 мс.

Все три из этих методов на самом деле используют ShellFolder под капотом, и разница с FileSystemView незначительна, но непосредственный вызов этого позволяет избежать накладных расходов двух других.

Примечание: Вы также можете привести это значение непосредственно к File вместо того, чтобы неявно получить его метод toString(), который поможет вам в дальнейшем:

File documents = (File) ShellFolder.get("fileChooserDefaultFolder");
0 голосов
/ 21 октября 2017
JFileChooser fileChooser = new JFileChooser();

fileChooser.setCurrentDirectory(new File(System.getProperty("user") + (File.separatorChar + "My Documents")));

int result = fileChooser.showOpenDialog(this);

if (result == JFileChooser.APPROVE_OPTION) {
    File selectedFile = fileChooser.getSelectedFile();
    System.out.println("Selected file: " + selectedFile.getAbsolutePath());
0 голосов
/ 14 сентября 2013

это то, что делает Eclipse, чтобы получить папку с документами пользователя

System.getProperty("user.dir") //$NON-NLS-1$
                    + File.separator + "workspace")

Надеюсь, это полезно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...