2010-02-16 81 views
2

我的腳本從網上下載文件,然後將它們保存在從同一個Web服務器獲取的名稱下。我需要一個篩選器 /卸妝無效字符文件/文件夾名稱在Windows NTFS下。文件/文件夾名稱的無效字符過濾器? (ruby)

我也很樂意爲多平臺過濾器。

注:像htmlentities將是巨大的....

+0

的可能的複製[如何使一個Ruby字符串安全的文件系統?](https://stackoverflow.com/questions/1939333/how-to-make-a-ruby-string-safe-for-a-filesystem) – 2018-02-20 14:41:38

回答

19

與Geo一樣,通過使用gsub,您可以輕鬆地將所有無效字符轉換爲有效字符。例如:

file_names.map! do |f| 
    f.gsub(/[<invalid characters>]/, '_') 
end 

你需要的所有文件名可能會在他們的可能的字符是不允許在文件系統上,以取代<invalid characters>。在上面的代碼中,每個無效字符被替換爲_

Wikipedia告訴我們,以下字符不允許在NTFS:

  • U + 0000(NUL)
  • /(斜槓)
  • \(反斜槓)
  • :(冒號)
  • *(星號)
  • ? (問號)
  • 「(引號)
  • <(小於)
  • (大於)

  • |(管道)

所以你gsub調用可能是這樣的:

file_names.map! { |f| f.gsub(/[\x00\/\\:\*\?\"<>\|]/, '_') } 

它用下劃線替換所有無效字符。

+1

@liwp:這絕對是一個解決方案。我知道gsub,但想知道是否有任何寶石,甚至可以跨平臺。通常他們幾乎沒有任何東西;-)感謝您的代碼。 – Radek 2010-02-16 22:22:58

0

我覺得你最好的選擇是gsub上的文件名。我知道你需要刪除/替換的其中一項是:

0

我不知道你打算以後如何使用這些文件,但幾乎最可靠的解決方案是將原始文件名保存在數據庫表(或其他序列化的散列)中,並在唯一ID之後命名物理文件你(或數據庫)生成。

PS此方法的另一個優點是您不必擔心具有相同名稱(或過濾爲相同名稱的不同名稱)的文件。

+0

我猜人類需要看這些文件。即使他刪除了不需要的字符,該文件的名稱仍然可能對某人有意義,而ID可能不會。 – Geo 2010-02-16 15:17:59

+0

好的,那麼。例如,如果您只打算通過HTTP進一步提供這些文件,那麼ID就可以。 – 2010-02-16 17:51:05

11
filename_string.gsub(/[^\w\.]/, '_') 

說明:替換一切,除了字字符(字母,數字,下劃線)

相關問題