如何检查Python中与平台不兼容的文件夹(文件)名称

3 投票
3 回答
1697 浏览
提问于 2025-04-16 21:49

我想知道怎么用Python检查一个字符串是否可以作为跨平台的文件夹名称。下面是我遇到的具体问题(文件夹名称以点号结尾),但我相信还有其他一些特殊情况(比如:con等)。

有没有相关的库可以用来处理这个问题?


我在Windows(7)上用Python(3.2)创建了一个以点号('.')结尾的文件夹,比如(不带方括号):[我假期做的事情,第二部分.]

当我把这个文件夹通过FTP传到Linux上时,它的名称里就没有点号了(这导致很多超链接失效)。

我在命令行检查了一下,发现这个文件夹的名字里确实没有点号。

mkdir tmp.
dir
cd tmp 
cd ..\tmp.

显然,在文件夹名称后面加一个点号是被忽略的,比如:

cd c:\Users.

这样做的效果和预期的一样。

3 个回答

0

我自己写了一个函数。我是从@Voo的回答开始的,然后根据这个回答添加了一些检查。

def is_valid_folder_name(name: str):
    # Define a regular expression pattern to match forbidden characters
    ILLEGAL_NTFS_CHARS = r'[<>:/\\|?*\"]|[\0-\31]'
    # Define a list of forbidden names
    FORBIDDEN_NAMES = ['CON', 'PRN', 'AUX', 'NUL',
                       'COM1', 'COM2', 'COM3', 'COM4', 'COM5',
                       'COM6', 'COM7', 'COM8', 'COM9',
                       'LPT1', 'LPT2', 'LPT3', 'LPT4', 'LPT5',
                       'LPT6', 'LPT7', 'LPT8', 'LPT9']
    # Check for forbidden characters
    match = re.search(ILLEGAL_NTFS_CHARS, name)
    if match:
        raise ValueError(
            f"Invalid character {match[0]} for filename {name}")
    # Check for forbidden names
    if name.upper() in FORBIDDEN_NAMES:
        raise ValueError(f"{name} is a reserved folder name in windows")
    # Check for empty name (disallowed in Windows)
    if name.strip() == "":
        raise ValueError("Empty file name not allowed in Windows")
    # Check for names starting or ending with dot or space
    match = re.match(r'^[. ]|.*[. ]$', name)
    if match:
        raise ValueError(
            f"Invalid start or end character ({match[0]})"
            f" in folder name {name}"
        )

如果有人发现我漏掉了什么,欢迎随时补充或者评论!

2

不要在文件或文件夹的名字后面加空格或者句号。虽然底层的文件系统可能支持这样的名字,但Windows的命令行和用户界面是不支持的。

http://msdn.microsoft.com/en-us/library/aa365247.aspx#naming_conventions

那一页会告诉你其他在Windows上不合法的名字,包括你自己提到的CON。

如果你遵守这些(看起来有点严格的)规则,我觉得在Linux和大多数其他系统上也会没问题。

2

很遗憾,这个问题没有简单的解决办法。在Windows系统上,你可以用下面的代码来去掉所有不合法的字符。不过,如果有人还在用FAT文件系统,你就得考虑这些,因为FAT的规则更严格。基本上,你需要查阅所有文件系统的文档,列出一个完整的非法字符列表。下面是NTFS文件系统的一个起点:

ILLEGAL_NTFS_CHARS = "[<>:/\\|?*\"]|[\0-\31]"
def __removeIllegalChars(name):
    # removes characters that are invalid for NTFS
    return re.sub(ILLEGAL_NTFS_CHARS, "", name)

然后你还需要一个“禁止使用”的名称列表,以避免使用COM。总之,这事情相当复杂……而且这还不包括Linux系统(不过据我所知,Linux的规则比较宽松)

撰写回答