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

问题描述 投票:0回答:3

我希望能够从 python 检查给定的字符串是否可以是有效的跨平台文件夹名称 - 下面是我遇到的具体问题(文件夹名称以 . 结尾),但我确信还有一些更特殊的问题案件(例如:骗局等)。

有这个库吗?


在 python (3.2) 中,我在 Windows (7) 上创建了一个名称以点('.')结尾的文件夹,例如(不带方括号):[我在假期里做了什么,第二部分。]

当创建的文件夹被 ftp 传输(到 linux,但我想这无关紧要)时,它不再有点(作为回报,这破坏了很多超链接)。

我从命令行检查过,该文件夹似乎没有“.”在文件名中

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

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

cd c:\Users.

按预期工作。

python windows validation filesystems cross-platform
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 而用户界面则不然。

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

该页面还将为您提供有关其他非法名称的信息,适用于 Windows。包括你自己所说的 CON。

如果您尊重这些(看似严厉的)规则,我认为您在 Linux 和大多数其他系统上也会是安全的。


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() == "":
        return 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:
        return ValueError(
            f"Invalid start or end character ({match[0]})"
            f" in folder name {name}"
        )

如果有人发现我遗漏了某些内容,请随时添加或评论!

© www.soinside.com 2019 - 2024. All rights reserved.