Những ký tự nào không hợp lệ cho tên tệp MS-DOS?


16

Tôi đang viết một thủ tục I / O tên tệp bằng ngôn ngữ lắp ráp x86-16. Phải mất tám ký tự (tôi không cần hỗ trợ tên tệp dài) từ bàn phím và in chúng sang trường nhập văn bản trên màn hình.

Hiện tại tôi đang cho phép số, chữ in hoa / in thường, dấu gạch dưới và dấu gạch nối.

Tôi muốn cho phép tất cả các biểu tượng hợp pháp, nhưng tôi không thể tìm thấy danh sách chính thức các ký tự bị cấm. Thông thường nói với tôi rằng dấu gạch chéo là bất hợp pháp, nhưng nếu tôi phải đoán, tôi sẽ nói rằng ký tự cộng là hợp pháp. (chỉnh sửa: Không phải!)

Tôi đã bỏ qua ký tự dấu chấm vì mã của tôi tự động xử lý nối thêm phần mở rộng thời gian và tệp.


17
Bạn cũng có thể thấy Retrocomputing hữu ích.
Bob

Hãy thử tạo một thư mục trong Windows và đặt '?' trong tên Một tooltip cho bạn biết các ký tự bị cấm. Điều này cho bạn một sự khởi đầu :) ...
Mixxiphoid

@Mixxiphoid sẽ không hoạt động vì tập hợp các ký tự được phép trong Windows lớn hơn nhiều. Ví dụ: +,;[]không gian và a-zđược phép trong Windows nhưng không phải DOS. Nhà thám hiểm cho tôi biết lỗi "Tên tệp không thể chứa bất kỳ ký tự \ / : * ? " < > |nào sau đây chỉ là tập hợp con của các ký tự bị cấm trong DOS
phuclv

1
@phuclv đó là lý do tại sao tôi nói 'Điều này cho bạn một sự khởi đầu' và cũng là lý do tại sao đây là một nhận xét và không phải là một câu trả lời.
Mixxiphoid

Tại sao tất cả các ký hiệu MS-DOS? Tại sao không xem xét các quy tắc hệ điều hành cũ hơn?
jpmc26

Câu trả lời:


30

Một bản tóm tắt súc tích có thể được tìm thấy trên Wikipedia :

Các ký tự pháp lý cho tên tệp DOS bao gồm:

  • Chữ in hoa A-Z
  • Số 0-9
  • Không gian (mặc dù dấu cách trong tên cơ sở hoặc phần mở rộng được coi là phần đệm và không phải là một phần của tên tệp, các tên tệp có khoảng trắng trong chúng phải được đặt trong dấu ngoặc kép để được sử dụng trên dòng lệnh DOS và nếu DOS lệnh được xây dựng theo chương trình, tên tệp phải được đặt trong dấu ngoặc kép khi được xem như một biến trong chương trình xây dựng lệnh DOS.)
  • ! # $ % & ' ( ) - @ ^ _ ` { } ~
  • Giá trị 128 Vang255 (mặc dù nếu dịch vụ NLS đang hoạt động trong DOS, một số ký tự được hiểu là chữ thường không hợp lệ và không khả dụng)

Điều này không bao gồm các ký tự ASCII sau:

  • " * + , / : ; < = > ? \ [ ] | [9]
  • Windows / MS-DOS không có ký tự thoát vỏ
  • .(U + 002E. Dừng hoàn toàn) trong các trường tên và phần mở rộng, ngoại trừ trong. và .. mục (xem bên dưới)
  • Chữ in thường a- z(được lưu dưới dạng A Z trên FAT12 / FAT16)
  • Điều khiển ký tự 0 Ném31
  • Giá trị 127 (DEL) [đáng ngờ - thảo luận]

https://en.wikipedia.org/wiki/8.3_filename#Directory_table

Và đây là những gì hướng dẫn sử dụng MS-DOS 6 chính thức nói

Đặt tên tệp và thư mục

Mỗi tệp và thư mục, ngoại trừ thư mục gốc trên mỗi ổ đĩa, phải có tên. Danh sách sau đây tóm tắt các quy tắc để đặt tên tệp và thư mục. Tên tệp và thư mục:

  • Có thể dài đến tám ký tự. Ngoài ra, bạn có thể bao gồm một phần mở rộng dài tối đa ba ký tự.
  • Không phân biệt chữ hoa chữ thường. Không quan trọng bạn sử dụng chữ hoa hay chữ thường khi bạn nhập chúng.
  • Chỉ có thể chứa các chữ cái từ A đến Z, các số từ 0 đến 9 và các ký tự đặc biệt sau: gạch dưới ( _), dấu mũ ( ^), ký hiệu đô la ( $), dấu ngã ( ~), dấu chấm than ( !), ký hiệu số ( #), dấu phần trăm ( %), ampersand ( &), dấu gạch ngang ( -), dấu ngoặc ( {}), tại dấu ( @), dấu ngoặc đơn ( `), dấu nháy đơn ( ') và dấu ngoặc đơn (). Không có nhân vật đặc biệt khác được chấp nhận.
  • Không thể chứa dấu cách, dấu phẩy, dấu gạch chéo ngược hoặc dấu chấm (trừ khoảng thời gian tách tên khỏi phần mở rộng).
  • Không thể trùng với tên của một tệp hoặc thư mục con khác trong cùng thư mục.

Đây là từ PC-DOS 7:

Tên bạn gán cho một tệp phải đáp ứng các tiêu chí sau:

  • Nó có thể chứa không quá tám ký tự.
  • Nó có thể bao gồm các chữ cái từ A đến Z, các số từ 0 đến 9 và các ký tự đặc biệt sau:

    _ underscore            ^  caret
    $ dollar sign           ~  tilde
    ! exclamation point     #  number sign
    % percent sign          &  ampersand
    - hyphen                {} braces
    @ at sign               `  single quote
    ' apostrophe            () parentheses
    

Lưu ý: Không có ký tự đặc biệt khác được chấp nhận.

  • Tên không thể chứa dấu cách, dấu phẩy, dấu gạch chéo ngược hoặc dấu chấm (ngoại trừ khoảng thời gian tách tên khỏi phần mở rộng).
  • Tên không thể là một trong những tên tệp dành riêng sau: CLOCK $, CON, AUX, COM1, COM2, COM3, COM4, ​​LPT1, LPT2, LPT3, LPT4, NUL và PRN.
  • Nó không thể cùng tên với một tệp khác trong thư mục.

Hướng dẫn sử dụng - PC DOS 7

Byte đầu tiên của tên không được là 0x20 (dấu cách). Tên ngắn hoặc phần mở rộng được đệm bằng khoảng trắng. Các ký tự ASCII đặc biệt 0x22 ( "), 0x2a ( *), 0x2b ( +), 0x2c ( ,), 0x2e ( .), 0x2f /( :), 0x3a ( ;), 0x3b ( <), 0x3c ( =), 0x3d ( >), 0x3d ( ?) , 0x5b ( [), 0x5c ( \), 0x5d ( ]), 0x7c ( |) không được phép.

Hệ thống tập tin FAT

Nếu bạn cũng quan tâm đến MS-DOS 5.0 thì đây chính là nó .


11
Nó có thể là đáng chú ý là mặc dù họ chỉ chứa các ký tự hợp lệ các tên tập tin đặc biệt CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, và LPT9cũng không được phép (xem ở đây )
Thomas Schremser

3
@ThomasSchremser "Không sử dụng", "Tránh" và "Không được đề xuất" không giống như "không được phép".
RobIII

1
@RobIII Có nhưng họ đã liên kết với tài liệu "Windows> Desktop", không liên quan đến tài liệu "MS-DOS". Các wiki cho DOS nói, "Có tên thiết bị dành riêng trong DOS mà không thể được sử dụng như tên tập tin bất kể phần mở rộng như họ đang chiếm đóng bởi tích hợp trong các thiết bị nhân vật". Nói cách khác, không được phép trong DOS và một số phiên bản Windows và không được khuyến nghị trong các phiên bản Windows khác.
Quantic

Thật thú vị khi `được gọi là một trích dẫn. Tôi đã luôn nghe thấy nó được gọi là backtick và '(cái mà họ gọi (không chính xác) là dấu nháy đơn) như một trích dẫn.
ale10ander

2
@ ale10ander yeah làm tôi ngạc nhiên. Tôi luôn ghét việc nhiều người sử dụng nó cho dấu nháy đơn (như trong Tôi) hoặc phần đầu của trích dẫn. Ví dụ, các tài liệu GNU luôn viết 'như thế này', điều này rất xấu và khó đọc đối với tôi
phuclv

12

Nói đúng ra, là một lập trình viên ứng dụng MS / PC / DR-DOS, bạn phải hỏi hệ điều hành về thông tin này. INT 0x21 với AX = 0x6505 trả về một con trỏ tới FCHARbảng được gọi là bảng NLS cho quốc gia và trang mã của bạn. Bảng này liệt kê một loạt các ký tự và một bộ ký tự nữa chấm dứt tên tệp.

Về lý thuyết, nó thay đổi theo quốc gia và trang mã. Nhưng thực tế là nó không được chính thức chuyển sang API Chương trình điều khiển OS / 2 và thực tế là FreeDOS có 1 bảng trên tất cả các loại tiền mã hóa và các quốc gia cho thấy rằng phần lớn là bất biến trong thực tế.

đọc thêm


10

Tôi đã tìm thấy điều này trong một hướng dẫn cho MS-DOS 3.3. Tôi đang chạy 6.22, nhưng có lẽ nó vẫn được áp dụng. Tôi đã sai về '+' được cho phép.

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


2
Một hướng dẫn từ back-in-day đáng tin cậy hơn Wikipedia
Stewart

@ Bắt đầu những gì quan trọng là các trích dẫn trên Wikipedia, không phải Wikipedia. Nếu nghi ngờ, chỉ cần kiểm tra các chú thích và tài liệu tham khảo trong bài viết \ @Mylifeisabug Tôi vừa thêm hướng dẫn sử dụng MS-DOS 6
phuclv

3

Nếu bạn chỉ muốn xác thực tên tệp, bạn có thể muốn sử dụng INT 21H/AH=60H (TRUENAME - CANONICALIZE FILENAME OR PATH)sau khi đảm bảo rằng tên tệp được truyền không có dấu hai chấm hoặc dấu gạch chéo ngược (chúng có thể được coi là ký tự ổ đĩa và thư mục): hàm lấy tên tệp được đề xuất của bạn và cố gắng chuẩn hóa nó bằng cách viết hoa các chữ cái và kiểm tra các ký tự không hợp lệ (nó cũng thêm một tên ổ đĩa / tên máy chủ và đường dẫn.)

Trong mã giả:

If !(filename contains {"/", "\", ".", ":"})
    Canonicalize filename (INT 21H/AH=60H)
    If !(CF is set) filename is valid
Filename is not valid
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.