Các ký tự được phép trong tên tệp


138

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)


.NET cung cấp thông tin đó cho Windows.
leppie


8
@kreker lưu ý rằng câu hỏi của bạn là về Android
congusbongus


Câu trả lời:


106

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ư CONtrong 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.hvà 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.hgiống hệt như conbả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).


4
Tôi thấy trang Wikipedia hơi mơ hồ và khó hiểu, ví dụ: "Một số hệ điều hành cấm một số ký tự cụ thể ...". Tôi thực sự đang tìm một bảng hoàn chỉnh liệt kê tất cả các ký tự được phép và không được phép.
anh chàng trăn

7
@python, đừng nhìn vào bảng đó, hãy nhìn vào cái honkin lớn bên dưới nó (có tên "So sánh giới hạn tên tệp"). Điều đó không quá mơ hồ trong nội dung của nó.
paxdiablo

52
Có lẽ tất cả những gì bạn cần là nhìn vào POSIX "Fully portable filenames"mục, trong đó liệt kê những điều sau:A–Z a–z 0–9 . _ -
Vladimir Kornea


1
@CpILL Có nhiều HĐH hơn là Windows, OSX và Linux ... một số có hệ thống tệp rất đơn giản.
súc sắc thanh lịch

32

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:

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).


7
Điều này LAF không đúng. Linux không cho phép /. Windows không cho phép dấu gạch chéo ngược và một số chuỗi (ví dụ CON).
kgadek

7
Vâng, do đó tôi đã nói ngoại trừ .
CpILL

2
Trên Mac (chạy HFS +), tôi có thể tạo các tệp có :s trong tên của chúng.
erwaman

Điều này LAF không đúng. Xem câu trả lời này để biết thêm các ký tự mà Windows không cho phép.
mbomb007

Windows cũng không cho phép bất kỳ ký tự điều khiển nào (nhưng Mac cũng vậy, trừ NUL)
Thomas Tempelmann

23

Trên hệ điều hành Windows, hãy tạo một tệp và cung cấp cho nó một ký tự không hợp lệ như \trong tên tệp. Kết quả là bạn sẽ nhận được một cửa sổ bật lên với tất cả các ký tự không hợp lệ trong tên tệp.

nhập mô tả hình ảnh ở đây


5

Để 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.


0

Đố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.


-1

Đâ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

2
Mã này không kiểm tra tên không hợp lệ (dành riêng) và cũng không kiểm tra ký tự không hợp lệ trong thay thế_space_with. Độ dài của tên tập tin nằm ngoài phạm vi. Vì vậy, :return: a valid name for Win/Mac/Linuxkhông đúng trong mọi hoàn cảnh.
ack
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.