我希望能够从 python 检查给定的字符串是否可以是有效的跨平台文件夹名称 - 下面是我遇到的具体问题(文件夹名称以 . 结尾),但我确信还有一些更特殊的问题案件(例如:骗局等)。
有这个库吗?
在 python (3.2) 中,我在 Windows (7) 上创建了一个名称以点('.')结尾的文件夹,例如(不带方括号):[我在假期里做了什么,第二部分。]
当创建的文件夹被 ftp 传输(到 linux,但我想这无关紧要)时,它不再有点(作为回报,这破坏了很多超链接)。
我从命令行检查过,该文件夹似乎没有“.”在文件名中
mkdir tmp.
dir
cd tmp
cd ..\tmp.
显然,在文件夹名称末尾添加一个点会被忽略,例如:
cd c:\Users.
按预期工作。
不,遗憾的是没有办法做到这一点。对于 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(尽管在那里它相当轻松)
文件或目录名请勿以空格或句点结尾。虽然 底层文件系统可能支持这样的名称,Windows shell 而用户界面则不然。
http://msdn.microsoft.com/en-us/library/aa365247.aspx#naming_conventions
该页面还将为您提供有关其他非法名称的信息,适用于 Windows。包括你自己所说的 CON。
如果您尊重这些(看似严厉的)规则,我认为您在 Linux 和大多数其他系统上也会是安全的。
我自己做了一个函数。我使用@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}"
)
如果有人发现我遗漏了某些内容,请随时添加或评论!