文件名中允许的字符


138

根据操作系统,在哪里可以找到文件名中允许的字符列表?(例如,在Linux上,:文件名中允许使用字符,但在Windows上则不允许)


.NET为Windows提供了该信息。
leppie 2011年


8
@kreker注意,您的问题是关于Android的
congusbongus 2013年


Answers:


106

您应该从Wikipedia Filename页面开始。它有一个大小适中的表(文件名限制的比较),列出了很多文件系统的保留字符。

它还具有有关每个文件系统的大量其他信息,包括保留文件名,例如CON在MS-DOS下。我之所以这样提,是因为我在将包含文件从缩短const.hcon.h并花了半个小时弄清楚编译器为何挂起时被这个问题所困扰。

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


4
我发现Wikipedia页面有些含糊和令人困惑,例如“某些操作系统禁止某些特殊字符...”。我实际上正在寻找一个完整的表,其中列出了所有允许和不允许的字符。
python dude

7
@python,不要看该表,请看它下面的一个大文件(标题为“文件名限制的比较”)。这是不是在内容上如此含糊。
paxdiablo 2011年

52
您可能需要的只是看看POSIX "Fully portable filenames"条目,其中列出了这些内容:A–Z a–z 0–9 . _ -
弗拉基米尔·科尼亚


1
@CpILL除了Windows,OSX和Linux外,还有更多的操作系统...有些操作系统具有非常简单的文件系统。
优雅的骰子

32

好了,看文件系统的比较,如果你只关心主力队员文件系统:

  • 视窗(FAT32,NTFS):除任何Unicode NUL\/:*"<>|。另外,开头或结尾没有空格,结尾没有句号
  • Mac(HFS,HFS +):除:或以外的任何有效Unicode/
  • Linux(ext [2-4]):除NUL或以外的任何字节/

所以任何字节除NUL\/:*"<>|,你不能有文件/文件夹打电话...没有控制字符(当然)。


7
这是不正确的。Linux不允许/。Windows不允许反斜杠和一些字符串(例如CON)。
kgadek

7
是的,因此我说
CpILL

2
在Mac(运行HFS +)上,我可以创建:名称为的文件。
erwaman

这是不正确的。有关Windows不允许的更多字符,请参见此答案
mbomb007 '17

Windows也不允许任何控制字符(但NUL除外,但Mac允许)
Thomas Tempelmann

23

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

在此处输入图片说明


5

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

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

/在Finder中在文件名中使用a是合法的,在终端中查看将显示的相同文件,并带有:

而且它的工作方式也相反:您不能/在终端中使用文件名中的a,但是a :可以,并且将/在Finder中显示为a 。

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


0

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

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

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


-1

这是在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: /programming/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

2
该代码不会检查无效(保留)名称,也不会检查replace_space_with中的无效字符。文件名长度超出范围。因此,:return: a valid name for Win/Mac/Linux并非在所有情况下都是如此。
ack
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.