【问题标题】:Allowed characters in filename文件名中允许的字符
【发布时间】:2011-06-16 09:20:12
【问题描述】:

在哪里可以找到文件名中允许的字符列表,具体取决于操作系统? (例如,在 Linux 上,字符 : 允许在文件名中,但在 Windows 上不允许)

【问题讨论】:

  • .NET 为 Windows 提供了该信息。
  • @kreker 注意你的问题是关于 Android 的
  • 不确定如何将其视为“对书籍、工具、软件库等的推荐”。它清楚地询问各种文件系统允许的字符是什么,如果您希望使用通用基础,这将非常方便。我认为这与询问任何特定限制是什么没有什么不同。我怀疑关闭的推荐理由更适合实际的推荐请求,例如“什么是学习Python编程的好书?”。
  • @paxdiablo 刚刚投票决定重新开放。

标签: special-characters filenames


【解决方案1】:

您应该从Wikipedia Filename 页面开始。它有一个大小合适的表 (Comparison of filename limitations),列出了很多文件系统的保留字符。

它还有大量关于每个文件系统的其他信息,包括保留的文件名,例如 MS-DOS 下的CON。我之所以提到这一点,是因为有一次我将包含文件从 const.h 缩短到 con.h 并花了半个小时弄清楚编译器挂起的原因时,我被它咬了。

原来 DOS 忽略了 设备扩展,因此 con.h 与输入控制台 con 完全相同(当然,这意味着编译器正在等待我在继续之前输入头文件)。

【讨论】:

  • 我发现维基百科页面有些模糊和混乱,例如“某些操作系统禁止某些特定字符......”。我实际上正在寻找一个完整的表格,列出所有允许和不允许的字符。
  • @python,不要看那张桌子,看看它下面的大喇叭(标题为“文件名限制比较”)。它的内容那么模糊。
  • 您可能只需要查看POSIX "Fully portable filenames" 条目,其中列出了这些:A–Z a–z 0–9 . _ -
  • @CpILL 请注意,# 必须在 Web 上下文中进行 urlencoded,否则会破坏 URL,因为 URL 中的 # 表示哈希片段的开始。不需要对 POSIX“完全可移植的文件名”进行 urlencoded。即使您关心的所有操作系统都允许文件名中包含 # 个字符,您最好只允许“可移植”字符,因为您还没有考虑到其他一些原因。
  • @VladimirKornea 问题状态“取决于操作系统”而不是 URL。在任何情况下,您都应该始终将文件名传递给 url 编码器/解码器。
【解决方案2】:

好的,如果您只关心主要的播放器文件系统,请查看Comparison of file systems

所以除了NUL\/:*?"<>、@98765434@7 之外的任何字节都可以没有文件/文件夹调用 ... 并且没有控制字符(当然)。

【讨论】:

  • 这是不正确的。 Linux 不允许/。 Windows 不允许使用反斜杠和某些字符串(例如 CON)。
  • 是的,所以我说除了
  • 在 Mac(运行 HFS+)上,我可以创建名称中带有 :s 的文件。
  • 这是不正确的。有关 Windows 不允许使用的更多字符,请参阅 this answer
  • 在路径中使用 %$# 会导致 bash 脚本出现问题 (cd $mydir) 在路径中使用 % 会导致 Windows 脚本出现问题 (cd %1)
【解决方案3】:

在 Windows 操作系统上创建一个文件并在文件名中给它一个无效字符,例如 \。结果,您将收到一个包含文件名中所有无效字符的弹出窗口。

【讨论】:

    【解决方案4】:

    更准确地说,关于 Mac OS X(现在称为 MacOS),Finder 中的 / 在 Unix 文件系统中被解释为 :

    当 Apple 从 Classic Mac OS 迁移时,这样做是为了向后兼容。

    在 Finder 的文件名中使用 / 是合法的,在终端中查看相同的文件会显示为 :

    反之亦然:您不能在终端的文件名中使用/,但: 可以,并且会在Finder 中显示为/

    某些应用程序可能会限制更多,并禁止使用这两个字符以避免混淆,或者因为它们保留了以前经典 Mac OS 的逻辑或平台之间的名称兼容性。

    【讨论】:

      【解决方案5】:

      这是在 python 中清理文件名的代码。

      import unicodedata
      
      def clean_name(name, replace_space_with=None):
          """
          Remove invalid file name chars from the specified name
      
          :param name: the file name
          :param replace_space_with: if not none replace space with this string
          :return: a valid name for Win/Mac/Linux
          """
      
          # ref: https://en.wikipedia.org/wiki/Filename
          # ref: https://stackoverflow.com/questions/4814040/allowed-characters-in-filename
          # No control chars, no: /, \, ?, %, *, :, |, ", <, >
      
          # remove control chars
          name = ''.join(ch for ch in name if unicodedata.category(ch)[0] != 'C')
      
          cleaned_name = re.sub(r'[/\\?%*:|"<>]', '', name)
          if replace_space_with is not None:
              return cleaned_name.replace(' ', replace_space_with)
          return cleaned_name
      

      【讨论】:

      • 代码不检查无效(保留)名称,也不检查 replace_space_with 中的无效字符。文件名长度超出范围。因此,:return: a valid name for Win/Mac/Linux 并非在所有情况下都是正确的。
      【解决方案6】:

      对于“英语语言环境”文件名,这很好用。我正在使用它来清理上传的文件名。文件名并不意味着链接到磁盘上的任何内容,它是用于下载文件时的,因此没有路径检查。

      $file_name = preg_replace('/([^\x20-~]+)|([\\/:?"<>|]+)/g', '_', $client_specified_file_name);
      

      基本上,它会为 Windows 和其他操作系统去除所有不可打印和保留的字符。您可以轻松扩展该模式以支持其他语言环境和功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-02
        • 2011-02-10
        • 2021-10-18
        • 1970-01-01
        • 2016-04-18
        • 1970-01-01
        • 2013-10-29
        相关资源
        最近更新 更多