2010-03-23 58 views
5

對於文件和目錄名,有一些受限制的字符(甚至在Windows中是全文件名)。這other question已經涵蓋了他們。如何在Java中檢索文件名的禁用字符?

在Java中,有沒有一種方法可以檢索禁用字符列表,這取決於系統(有點像檢索斷路器字符)?或者我只能自己放列表,檢查系統?


編輯:從一般的問題,在我的特殊情況更多的背景,一邊。

我使用默認名稱,來自某些數據(對其內容沒有真正的控制權),並將此名稱作爲默認文件名(使用setSelectedFile())提供給JFileChooser。但是,這個截斷了最後一個無效字符之前的任何內容。

這些默認名稱有時會以「mm/dd/yy」格式結束日期,僅保留默認名稱中的「yy」,因爲「/」被禁止。因此,檢查異常並不是真正的選擇,因爲文件本身甚至還沒有創建。

編輯之二:嗯,這讓我想,如果JFileChooser截斷了這個名字,它可能有權訪問這些字符的列表,可以進一步檢查。

編輯ter:好吧,檢查來自JFileChooser的源代碼顯示了一些非常簡單的東西。對於文本字段,它使用file.getName()。它實際上並不檢查無效字符,它只是將「/」作爲路徑分隔符,並僅保留最終的「實際文件名」。其他禁止的字符實際上通過。

回答

4

當談到與「禁」字打交道我寧願縮手縮腳和禁令/更換可以在任何文件系統出現問題了所有的「特」字。

即使技術上允許,有時候這些角色也會引起怪異。

例如,我們遇到了一個問題,即PDF文件正在寫入(成功)到SAN,但是當通過Web服務器從該位置提供時,一些字符會在我們嵌入PDF時導致問題一個在Firefox中呈現的HTML頁面。如果直接訪問PDF並且在其他瀏覽器中正常,那就好了。 Firefox和Adobe Reader交互方式出現一些奇怪的錯誤。

摘要:在文件名「特」字 - >奇怪的錯誤等待發生

最後,可以肯定的唯一方式是使用白名單。

+0

定義「特殊字符」。 – 2010-03-23 10:13:53

+0

+1白名單 – 2010-03-23 10:34:54

+2

+1在大多數UNIX-y文件系統中,唯一被禁止的字符是'/'和nul-字符'\ 0'。 – 2010-03-23 11:10:45

-2

看看這個鏈接瞭解如何獲取應用程序運行的操作系統。基本上你需要使用System.getProperty(「os.name」)並執行equals()或contains()來查找操作系統。

雖然知道操作系統並不一定會告訴您正在使用的底層文件系統,例如Mac可以讀取和寫入FAT32文件系統。

來源:http://www.mkyong.com/java/how-to-detect-os-in-java-systemgetpropertyosname/

2

擁有某些「禁止使用的字符」只是創建文件時可能會出錯的其中一種(其他的是訪問權限和文件和路徑名稱長度)。

當您嘗試創建文件時,如果有其他人無法捕捉,嘗試捕獲其中的一些內容並沒有什麼意義。正確處理例外。

+0

事實上,這個名稱是從某些數據中檢索的默認名稱,因此它可能包含不適合文件名的字符。這個默認的JFileChooser被賦予了一個JFileChooser,而這個JFileChooser在截斷了一個被禁止的字符前截斷了所有的東西。所以在這種情況下,我需要先替換這些字符,這樣默認的字符纔有意義。在這種情況下,沒有異常拋出,因爲該文件尚未創建。 – Gnoupi 2010-03-23 10:37:45

+1

難道你不能做一個安全的默認? (比如只使用ascii-7?)。另一方面,您可以:1)將候選默認值傳遞給JFileChooser 2)請求截斷字符串(不顯示對話框)3)如果返回的文件名較短,則知道禁用的字符的位置。 – helios 2010-03-23 10:42:25

+0

我的部分與JFileChooser實際上是一個問題,只有當使用路徑分隔符時,現在在我的問題中描述。對於其他被禁止的字符,JfileChooser實際上並不過濾任何東西,它只是返回輸入的文件名。那麼你的解決方案可能是最簡單的,只是在試圖真正寫入文件和處理異常時進行檢查。 – Gnoupi 2010-03-23 11:08:35

2

您是否嘗試過使用File.getCanonicalPath並將其與原來的文件名(或任何由getAbsolutePath檢索)?

這不會給你實際的字符,但它可以幫助你確定這是否是你正在運行的操作系統中的有效文件名。

相關問題