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


当前回答

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

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

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

其他回答

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

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

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

我采取了不同的方法。我不检查字符串是否只包含有效字符,而是查找无效/非法字符。

注意:我需要验证一个路径字符串,而不是一个文件名。但是如果您需要检查文件名,只需将/添加到该集合。

def check_path_validity(path: str) -> bool:
    # Check for invalid characters
    for char in set('\?%*:|"<>'):
        if char in path:
            print(f"Illegal character {char} found in path")
            return False
    return True

与其试图识别所有不需要的字符, 除了可接受的字符,你可以寻找任何东西。这里有一个正则表达式,用于除posix字符以外的任何字符: Cleaned_name = re.sub(r'[^[:alnum:]。_-]', ", name)

好的,看看文件系统的比较如果你只关心主要玩家的文件系统:

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

所以任何字节除了NUL, \, /,:, *, ?, ", <, >, |,你不能有文件/文件夹调用。或. .当然,没有控制字符。

在Windows操作系统上创建一个文件,并在文件名中给它一个像\这样的无效字符。结果,你会得到一个弹出窗口,所有的无效字符在一个文件名。