2011-04-19 87 views
4

想知道是否有辦法從JFileChooser中選擇的文件返回UNC路徑。我將要選擇的文件將駐留在具有UNC路徑的映射驅動器上。現在,我似乎只能拉回映射驅動器的驅動器號。如何從JFileChooser中檢索UNC路徑而不是映射的驅動器路徑

+0

'JFileChooser'方法'getSelectedFile()'返回一個具有這個信息的'File'。 – trashgod 2011-04-19 21:12:50

+0

這幫了我很多,雖然我需要當前機器的UNC路徑,而不是映射驅動器。使用'ipconfig/all'並切片就可以了。你應該在上面進行編輯並將其作爲獲得信譽的答案。感謝您發佈解決方案。 – moonlightcheese 2012-03-08 21:38:56

+0

@trashgod:這裏有一些名聲在等着你; P。 – Zecas 2012-05-28 09:05:48

回答

2

JFileChooser方法getSelectedFile()返回一個File,它可能有幫助的信息。

「對於Microsoft Windows平臺,... UNC路徑名的前綴爲"\\\\";主機名和共享名稱是名稱序列中的前兩個名稱。」

+0

請擴展,它如何具有此信息? – 2017-09-07 20:05:32

+0

@PaulTaylor:我已經闡述過了。 – trashgod 2017-09-07 21:57:08

1

如果其他人正在尋找備用(我認爲更簡單)的解決方案, 您可以使用ShellFolder.getDisplayName()找到信息。

System.out.println(ShellFolder.getShellFolder(new File(filePath.substring(0,3))).getDisplayName()); 

這也可能是有用的:例如,你可以從字符串這裏分析的驅動器的網絡位置

File.listRoots(); 
+2

這是可行的,因爲默認情況下,Windows映射的網絡驅動器將驅動器標籤設置爲'$ SHARENAME(\\ $ SERVER)'。然而,用戶可以自由地將此標籤更改爲完全不同的標籤,因此依靠「ShellFolder.getDisplayName」始終擁有此信息是不明智的。 – sqweek 2016-08-09 04:10:42

2

https://stackoverflow.com/users/715934/tasoocoo

我最終找到一個解決方案,執行NET USE命令:

filePath = fc.getSelectedFile().getAbsolutePath(); 
Runtime runTime = Runtime.getRuntime(); 
Process process = runTime.exec("net use"); 
InputStream inStream = process.getInputStream(); 
InputStreamReader inputStreamReader = new InputStreamReader(inStream); 
BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 
String line = null; 
String[] components = null; 
while (null != (line = bufferedReader.readLine())) { 
    components = line.split("\\s+"); 
    if ((components.length > 2) && (components[1].equals(filePath.substring(0, 2)))) { 
     filePath = filePath.replace(components[1], components[2]); 
    } 
} 
1

當我評論Gerry的回答時,ShellFolder.getDisplayName是不可靠的,因爲用戶可以將顯示名稱更改爲任何他們想要的。

但是,UNC路徑似乎通過sun.awt.shell.ShellFolder可用。這當然是一個「內部專有API」,所以不能保證這將繼續在Java的未來版本中工作,但在Windows 7中針對java 1.8.0_31進行測試時,我看到ShellFolderColumnInfo標題爲Attributes,它對於網絡驅動器似乎包括UNC路徑作爲一個裸體String。例如:

File networkDrive = new File("G:\"); 
ShellFolder shellFolder = ShellFolder.getShellFolder(networkDrive); 
ShellFolderColumnInfo[] cols = shellFolder.getFolderColumns(); 
for (int i = 0; i < cols.length; i++) { 
    if ("Attributes".equals(cols[i].getTitle())) { 
     String uncPath = (String) shellFolder.getFolderColumnValue(i); 
     System.err.println(uncPath); 
     break; // don't need to look at other columns 
    } 
} 

如果你去我在資源管理器的電腦,切換到詳細信息視圖,並打開「網絡位置」一欄,它似乎通過ShellFolder API以匹配「屬性」我們得到什麼。不確定「屬性」來自哪裏,或者它是否在非英語語言環境中更改。

+0

確定JVM似乎使用'IShellDetails :: getDetailsOf'來填充'ShellFolderColumnInfo.title',這裏所述可以根據語言環境改變: https://msdn.microsoft.com/zh-cn/library/windows/桌面/ bb775104%28V = vs.85%29。aspx 但msdn也說列0/1/2/3總是名稱/大小/類型/修改日期。 Java的ColumnInfo標題與MSDN匹配,但實際上列值表示DiskLabel/Type/Size/FreeSpace。它可能更便於直接索引列,即'String uncPath =(String)shellFolder.getFolderColumnValue(6);' – sqweek 2016-08-09 05:38:27

+0

另請注意,Size列(1)真的存儲類型可能會被使用,我發現一個本地驅動器報告「本地磁盤」和網絡驅動器報告「網絡驅動器」 – 2017-09-08 08:43:02