文件/文件夹名称的无效字符过滤器?(Ruby)

5
我的脚本从网络下载文件,然后将它们保存在与相同网站获取的名称相同的位置。我需要一个能够过滤或删除Windows NTFS下无效字符的文件/文件夹名称过滤器。如果有多平台过滤器就更好了。
注:类似于htmlentities的东西会很棒...

可能是重复的问题,参考如何使Ruby字符串对文件系统安全? - Jon Schneider
4个回答

22

就像 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,但我在想是否有任何gem可用,甚至跨平台。通常情况下,对于任何东西都很少有它们;-)感谢您的代码。 - Radek

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

说明:将除单词字符(字母、数字、下划线)点号之外的所有内容替换掉。


0
我认为你最好的选择是对文件名使用gsub函数。其中一件你需要删除/替换的内容是:

这不是适用于Windows的正确语句。 - CAMOBAP

0

我不知道你计划如何后续使用这些文件,但最可靠的解决方案是将原始文件名保存在数据库表中(或以其他方式序列化哈希),并根据您(或数据库)生成的唯一ID命名物理文件。

另外,此方法的另一个优点是您无需担心具有相同名称(或过滤为相同名称的不同名称)的文件。


我猜人类需要查看那些文件。即使他删除了不需要的字符,文件名仍然可能对某些人有意义,而ID可能没有。 - Geo
好的,那么如果您只计划通过HTTP进一步提供这些文件,ID就可以了。 - Mladen Jablanović

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接