我的makeValidFilename函数可能出错?

时间:2009-12-14 19:23:12

标签: python filesystems sanitization file-rename

它受到"How to make a valid Windows filename from an arbitrary string?"的启发,我编写了一个函数,它将采用任意字符串并使其成为有效的文件名。

我的功能在技术上应该是这个问题的答案,但我想确保在发布它作为答案之前我没有做过任何愚蠢或忽略的事情。

我将此作为tvnamer的一部分写成了 - 这是一个实用程序,可以获取电视剧集文件名,并且从http://www.thetvdb.com拉出一集,将其重命名为一致,而源文件名必须是有效文件,系列名称已更正,而剧集名称 - 因此两者都可以包含理论上的任何字符。我不太关心安全性作为可用性 - 它主要是为了防止文件被重命名.some.series - [01x01].avi而文件“消失”(而不是挫败邪恶的人)

它做了一些假设:

  • 文件系统支持Unicode文件名。 HFS +和NTFS都可以,这将覆盖大多数用户。还有一个normalize_unicode参数来删除Unicode字符(在tvnamer中,这是通过配置XML文件设置的)
  • 该平台是Darwin,Linux,其他一切都被视为Windows
  • 文件名是可见的(不是像.bashrc这样的点文件) - 如果需要,修改代码以允许.abc格式文件名就足够了

我(希望)处理的事情:

  • 如果文件名以.开头,则前缀下划线(阻止文件名. ..和文件消失)
  • 删除Linux上的目录分隔符:/,OS X上的/:
  • 删除无效的Windows文件名字符\/:*?"<>|(在Windows上,或强制使用windows_safe=True时)
  • 使用下划线预留保留的文件名(COM2变为_COM2NUL变为_NUL等)
  • Unicode数据的可选标准化,因此å变为a并且不可转换的字符被删除
  • 在Linux / Darwin上截断超过255个字符的文件名,在Windows上截断超过32个字符

可以在http://gist.github.com/256270找到代码和一堆测试用例。可以找到“生产”代码in tvnamer/utils.py

此功能有错误吗?我错过了什么条件?

1 个答案:

答案 0 :(得分:1)

有一点我注意到:在NTFS下,某些文件无法在特定目录中创建。 例如。 $ boot in root