2012-03-13 65 views
19

我需要使用Java查找我的文檔路徑。下面的代碼不給我「準確」 loation在Java中獲取我的文檔路徑

System.getProperty("user.home");

應該是什麼其他的方式左右?

P.S: 我不想使用JFileChooser骯髒的伎倆。

+0

可能重複你必須讓你的手髒的一種方式或其他。使用JNA/JNI的方法可以通過'McDowell'海報找到:http://stackoverflow.com/questions/585534/what-is-the-best-way-to-find-the-users-home-directory- in-java – sethcall 2012-03-13 02:44:59

+0

發佈的示例中沒有帶有最新JNA的工作解決方案 – 2012-03-13 02:56:03

+0

嗯,我不能說這些,但所有跡象表明,要獲得正確的解決方案非常艱難,而且像JNI似乎需要做'正確的東西'(即直接詢問窗口) – sethcall 2012-03-13 02:57:18

回答

8

您可以使用註冊表查詢來獲取它,不需要JNA或管理員權限。

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

很明顯,除了Windows之外,這將失敗,我不確定這是否適用於Windows XP。

編輯:在代碼中的工作時序 將這個:

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查詢」完成,這將鎖定的過程中,這可能會導致麻煩dependeing你在做什麼。

+0

有沒有辦法直接從Java內查詢註冊表? – 2012-03-13 20:19:09

+0

通常可以使用'java.util.prefs'軟件包提供的工具,但它僅限於SOFTWARE \ JavaSoft \ Prefs'樹,我已經閱讀過與Windows'UAC衝突的內容。 除此之外,還有一些本機解決方案提供了一個JNI DLL來讀取和寫入Windows註冊表。但顯然這對項目分配有很大的影響。 'reg'命令應該是安全的,可以快速返回並且不會鎖定,因此我認爲這是查詢註冊表的最佳方式,即使它有點冗長(總是可以放入實用程序類) – pdinklag 2012-03-14 19:30:14

1

"user.home"返回用戶的主目錄,而不是「我的文檔」文件夾。 在Windows中,這將是 「C:\ Users \用戶名\」 爲Vista或Windows 7,或 「C:\ Documents和Settings \用戶名」 的XP

你想要的是:

System.out.println(System.getProperty("user.home") + File.separatorChar + "My Documents"); 
+9

該邏輯不可靠。文檔文件夾可能已被重定向到別處,或者該名稱可能是另一種語言。 – 2012-03-13 03:25:30

20

這很簡單,JFileChooser發現它爲你

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

我希望這可以幫助別人

+1

謝謝,它爲我工作... :) – tausun 2013-01-17 06:06:00

1

這就是日食確實讓用戶的文檔文件夾

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

希望這是有幫助!

+0

這不是一個文檔文件夾 – coolguy 2017-05-29 18:02:02

2

使用JNA你可以這樣做:

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

JNA提取物對即時一個DLL,然後使用JNI這個DLL使Windows API調用。它雖然隱藏了你的所有JNI細節。使用JNA與使用任何其他Java庫JAR一樣簡單。

13

由於從@xchiltonx最upvoted答案使用JFileChooser我想補充一點,對於性能,這比使用JFileChooser更快

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

在我的電腦,JFileChooser形式給出需要300毫秒,和直接調用FileSystemView需要不到100ms。

注意:現在的問題是How to find 「My Documents」 folder in Java

+0

這指的是我不存在的文件夾... c:\ Users \ \ Documents。我的系統上的文檔文件夾稱爲我的文檔。 – JavaLatte 2016-03-09 16:27:18

+1

@Javababe在文件瀏覽器上測試返回的路徑。它可能是一個'符號鏈接'。 – IvanRF 2016-03-09 16:57:28

+0

你是對的:Documents文件夾不顯示,但如果你真的使用它,它會解析爲我的文檔。那麼,你每天都會學到一些東西...... :-) – JavaLatte 2016-03-09 17:24:50

-3
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

只需添加這一個 +(File.separatorChar +「我的文檔」) – 2017-10-21 16:07:25

+2

你的答案有什麼好處?你至少可以解釋爲什麼這是一個更好的方式來做到這一點。已經有一個被接受的答案,另一個得分爲18. – louisfischer 2017-10-21 16:29:12

+0

,因爲它會將你引導到我的文檔..它.. – 2017-10-26 16:32:04