根据操作系统的不同,在哪里可以找到文件名中允许的字符列表? (例如,在Linux中,字符:被允许出现在文件名中,但在Windows中不允许)
当前回答
在Windows操作系统上创建一个文件,并在文件名中给它一个像\这样的无效字符。结果,你会得到一个弹出窗口,所有的无效字符在一个文件名。
其他回答
对于“English locale”文件名,这很有效。我用这个来消毒上传的文件名。文件名并不意味着要链接到磁盘上的任何东西,它是在文件下载时使用的,因此没有路径检查。
$file_name = preg_replace('/([^\x20-~]+)|([\\/:?"<>|]+)/g', '_', $client_specified_file_name);
基本上,它会删除Windows和其他操作系统中所有不可打印和保留的字符。您可以轻松地扩展该模式以支持其他地区和功能。
与其试图识别所有不需要的字符, 除了可接受的字符,你可以寻找任何东西。这里有一个正则表达式,用于除posix字符以外的任何字符: Cleaned_name = re.sub(r'[^[:alnum:]。_-]', ", name)
你应该从Wikipedia文件名页面开始。它有一个相当大的表(文件名限制的比较),列出了相当多文件系统的保留字符。
它还拥有关于每个文件系统的大量其他信息,包括保留文件名,例如MS-DOS下的CON。我之所以提到这一点,只是因为有一次我把一个包含文件从conn .h缩短为con.h,并花了半个小时弄清楚为什么编译器挂起。
事实证明DOS忽略了设备的扩展名,因此con.h与con(输入控制台)完全相同(当然,这意味着编译器在继续之前会等我输入头文件)。
好的,看看文件系统的比较如果你只关心主要玩家的文件系统:
窗口(FAT32, NTFS):任何Unicode NUL除外 , \, /, :, *, ?, ", <, >, |.此外,开头或结尾没有空格字符,结尾没有句号。 Mac(HFS, HFS+):除:或/之外的任何有效Unicode Linux(ext[2-4]):除了NUL和/以外的任何字节
所以任何字节除了NUL, \, /,:, *, ?, ", <, >, |,你不能有文件/文件夹调用。或. .当然,没有控制字符。
下面是在python中清除文件名的代码。
import unicodedata
def clean_name(name, replace_space_with=None):
"""
Remove invalid file name chars from the specified name
:param name: the file name
:param replace_space_with: if not none replace space with this string
:return: a valid name for Win/Mac/Linux
"""
# ref: https://en.wikipedia.org/wiki/Filename
# ref: https://stackoverflow.com/questions/4814040/allowed-characters-in-filename
# No control chars, no: /, \, ?, %, *, :, |, ", <, >
# remove control chars
name = ''.join(ch for ch in name if unicodedata.category(ch)[0] != 'C')
cleaned_name = re.sub(r'[/\\?%*:|"<>]', '', name)
if replace_space_with is not None:
return cleaned_name.replace(' ', replace_space_with)
return cleaned_name
推荐文章
- 文件名中允许的字符
- Git复制文件保存历史
- 如何从Python中的文件名中替换(或剥离)扩展名?
- 在c#中从URI字符串获取文件名
- 使用JavaScript从字符串中删除除空格之外的所有特殊字符
- 在Python中构建完整的路径文件名
- 在Windows上更改文件的情况?
- 如何从PHP的完整路径中获得文件名?
- NTFS中的最大文件名长度(Windows XP和Windows Vista)?
- 什么是垂直标签?
- 使用Bash时需要转义哪些字符?
- 我如何从包含绝对文件路径的字符串中获得文件名?
- 给定文件系统路径,是否有一种更短的方法来提取没有扩展名的文件名?
- \r和\n有什么区别?
- 路径组件的命名标准是什么?