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

aor9mmx1  于 12个月前  发布在  Windows
关注(0)|答案(3)|浏览(103)

我希望能够从python检查给定的字符串是否可以是有效的跨平台文件夹名称-下面是我遇到的具体问题(文件夹名称以.结尾),但我相信还有一些特殊情况(例如:con等)。
有图书馆吗?
从python(3.2)开始,我在Windows(7)上创建了一个文件夹,文件名以点('.')结尾,例如:(不带方括号):[我在假期里做了什么,第二部分]
当创建的文件夹是ftp'd(到Linux,但我想这是无关紧要的),它没有点在它了(作为回报,这打破了很多超链接)。
我已经从命令行检查过了,文件夹的文件名中似乎没有".“

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

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

cd c:\Users.

正如预期的那样。

ru9i0ody

ru9i0ody1#

不,很遗憾没有办法做到这一点。对于windows,你基本上可以使用下面的代码来删除所有非法字符-但是如果有人仍然有一个FAT文件系统,你也必须处理这些,因为这些是更严格的。基本上,您必须阅读所有文件系统的文档,并列出一个完整的列表。以下是作为起点的第一个问题:

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

然后你需要一些“禁止”的名单,以及摆脱COM。几乎是一团糟...而这忽略了Linux(尽管它是相当轻松的afaik)

bq9c1y66

bq9c1y662#

不要以空格或句点结尾文件或目录名。尽管底层文件系统可能支持此类名称,但Windows shell和用户界面不支持。
http://msdn.microsoft.com/en-us/library/aa365247.aspx#naming_conventions
该页面将给予您有关其他非法名称的信息,也就是说,为Windows。包括你自己说的骗局。
如果你尊重这些(看起来很苛刻的)规则,我认为你在Linux和大多数其他系统上也是安全的。

acruukt9

acruukt93#

我自己做了一个功能。我使用@Voo answer作为开始,并添加了基于this answer的检查。

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

请,如果有人发现我错过了什么可以自由添加或评论!

相关问题