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

3
我希望能够检查一个给定的字符串是否是有效的跨平台文件夹名称。以下是我遇到的具体问题(文件夹名称以点号结尾),但我相信还有一些更特殊的情况(例如:con等)。是否有库可以做到这一点?
从Python(3.2)中,我在Windows 7上创建了一个以点(“.”)结尾的名称为“我的假期工作,第二部分”的文件夹(不包括方括号)。当所创建的文件夹被FTP到Linux时,它中不再有点(反过来,这破坏了许多超链接)。
我已经从命令行检查过了,看起来文件夹名称中没有'.'。
mkdir tmp.
dir
cd tmp 
cd ..\tmp.

显然,在文件夹名称的末尾添加一个句点会被忽略,例如:

cd c:\Users.

正如预期的那样工作。


1
你可以尽可能地简化文件夹名称,无论使用哪个平台,这样可以避免麻烦。 - Cat Plus Plus
你试过这个命令 mkdir "tmp." 吗?或许在 Windows 命令提示符中,"." 有特殊的含义。 - Pushpak Dagade
@Cat Plus Plus - 在具体的例子中,文件夹名称是由用户输入驱动的。我的问题更多地涉及一般情况,即:给定一个字符串,确定它是否可以是有效的文件夹名称。是的,可以采用解决方法,我已经应用了,但我仍在寻找一种不那么限制性的解决方案。 - zsepi
3个回答

2
抱歉,无法实现此操作。对于Windows系统,您可以使用以下代码删除所有非法字符,但如果有人仍然使用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(尽管在那里它相当轻松)。


2
不要在文件或目录名称的末尾使用空格或句点。尽管底层文件系统可能支持这种名称,但Windows shell和用户界面不支持。
该页面将为您提供有关其他非法名称的信息,适用于Windows。包括像你自己说的CON。
如果您遵守这些(看似苛刻的)规则,我认为您在Linux和大多数其他系统上也会很安全。
原链接:http://msdn.microsoft.com/en-us/library/aa365247.aspx#naming_conventions

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}"
        )

请,如果有人发现我漏掉了什么,请随意添加或评论!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接