Tôi có thể tìm danh sách các ký tự được phép trong tên tệp ở đâu, tùy thuộc vào hệ điều hành? (ví dụ: trên Linux, ký tự :
được cho phép trong tên tệp, nhưng không phải trên Windows)
Tôi có thể tìm danh sách các ký tự được phép trong tên tệp ở đâu, tùy thuộc vào hệ điều hành? (ví dụ: trên Linux, ký tự :
được cho phép trong tên tệp, nhưng không phải trên Windows)
Câu trả lời:
Bạn nên bắt đầu với trang Tên tệp Wikipedia . Nó có một bảng có kích thước khá ( So sánh các giới hạn tên tệp ), liệt kê các ký tự dành riêng cho khá nhiều hệ thống tệp.
Nó cũng có rất nhiều thông tin khác về mỗi hệ thống tệp, bao gồm các tên tệp dành riêng như CON
trong MS-DOS. Tôi đề cập đến mà chỉ bởi vì tôi đã cắn một lần khi tôi rút ngắn một bao gồm tập tin từ const.h
đến con.h
và dành nửa giờ để tìm ra lý do tại sao các trình biên dịch treo.
Hóa ra DOS bỏ qua các phần mở rộng cho các thiết bị sao cho con.h
giống hệt như con
bảng điều khiển đầu vào (tất nhiên, có nghĩa là trình biên dịch đang chờ tôi nhập vào tệp tiêu đề trước khi tiếp tục).
POSIX "Fully portable filenames"
mục, trong đó liệt kê những điều sau:A–Z a–z 0–9 . _ -
OK, vì vậy hãy xem So sánh các hệ thống tệp nếu bạn chỉ quan tâm đến các hệ thống tệp của trình phát chính:
NUL
, \
, /
, :
, *
, "
, <
, >
, |
. Ngoài ra, không có ký tự khoảng trắng ở đầu hoặc cuối, và không có dấu chấm ở cuối .:
hoặc/
NUL
hoặc/
vì vậy bất kỳ byte trừ NUL
, \
, /
, :
, *
, "
, <
, >
, |
và bạn không thể có các file / thư mục gọi .
hay ..
và không có ký tự điều khiển (tất nhiên).
/
. Windows không cho phép dấu gạch chéo ngược và một số chuỗi (ví dụ CON
).
:
s trong tên của chúng.
Để chính xác hơn về Mac OS X (bây giờ được gọi là MacOS) /
trong Finder được hiểu :
theo hệ thống tệp Unix.
Điều này đã được thực hiện để tương thích ngược khi Apple chuyển từ Classic Mac OS.
Việc sử dụng một /
tên tệp trong Finder là hợp pháp , nhìn vào cùng một tệp trong thiết bị đầu cuối, nó sẽ hiển thị với a :
.
Và nó cũng hoạt động theo cách khác: bạn không thể sử dụng /
tên tệp trong thiết bị đầu cuối, nhưng a :
vẫn ổn và sẽ hiển thị dưới dạng /
trong Finder.
Một số ứng dụng có thể hạn chế hơn và cấm cả hai ký tự để tránh nhầm lẫn hoặc do chúng giữ logic từ Hệ điều hành Mac cổ điển trước đó hoặc để tương thích tên giữa các nền tảng.
Đối với tên tệp "tiếng địa phương tiếng Anh", điều này hoạt động độc đáo. Tôi đang sử dụng điều này để vệ sinh tên tập tin tải lên. Tên tệp không có nghĩa là được liên kết với bất cứ thứ gì trên đĩa, đó là khi tệp đang được tải xuống do đó không có kiểm tra đường dẫn.
$file_name = preg_replace('/([^\x20-~]+)|([\\/:?"<>|]+)/g', '_', $client_specified_file_name);
Về cơ bản, nó loại bỏ tất cả các ký tự không thể in và dành riêng cho Windows và các HĐH khác. Bạn có thể dễ dàng mở rộng mô hình để hỗ trợ các chức năng và chức năng khác.
Đây là mã để làm sạch tên tập tin trong 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
không đúng trong mọi hoàn cảnh.