根据操作系统,在哪里可以找到文件名中允许的字符列表?(例如,在Linux上,:
文件名中允许使用字符,但在Windows上则不允许)
根据操作系统,在哪里可以找到文件名中允许的字符列表?(例如,在Linux上,:
文件名中允许使用字符,但在Windows上则不允许)
Answers:
您应该从Wikipedia Filename页面开始。它有一个大小适中的表(文件名限制的比较),列出了很多文件系统的保留字符。
它还具有有关每个文件系统的大量其他信息,包括保留文件名,例如CON
在MS-DOS下。我之所以这样提,是因为我在将包含文件从缩短const.h
到con.h
并花了半个小时弄清楚编译器为何挂起时被这个问题所困扰。
原来DOS 忽略了设备的扩展名,因此与输入控制台con.h
完全相同con
(当然,这意味着编译器在继续输入之前要等待我键入头文件)。
POSIX "Fully portable filenames"
条目,其中列出了这些内容:A–Z a–z 0–9 . _ -
好了,看文件系统的比较,如果你只关心主力队员文件系统:
NUL
,\
,/
,:
,*
,"
,<
,>
,|
。另外,开头或结尾没有空格,结尾没有句号。:
或以外的任何有效Unicode/
NUL
或以外的任何字节/
所以任何字节除NUL
,\
,/
,:
,*
,"
,<
,>
,|
,你不能有文件/文件夹打电话.
或..
没有控制字符(当然)。
/
。Windows不允许反斜杠和一些字符串(例如CON
)。
:
名称为的文件。
对于“英语语言环境”文件名,这很好用。我正在用它来清理上传的文件名。文件名并不意味着链接到磁盘上的任何内容,它是用于文件下载时的,因此没有路径检查。
$file_name = preg_replace('/([^\x20-~]+)|([\\/:?"<>|]+)/g', '_', $client_specified_file_name);
基本上,它会删除Windows和其他OS的所有不可打印和保留的字符。您可以轻松扩展模式以支持其他语言环境和功能。
这是在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: /programming/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
:return: a valid name for Win/Mac/Linux
并非在所有情况下都是如此。