Karakter mana yang tidak valid untuk nama file MS-DOS?

16

Saya sedang menulis nama file I / O prosedur dalam bahasa assembly x86-16. Dibutuhkan delapan karakter (saya tidak perlu mendukung nama file panjang) dari keyboard dan mencetaknya ke bidang input teks di layar.

Saat ini saya sedang mengizinkan angka, huruf besar / kecil, garis bawah, dan tanda hubung.

Saya ingin mengizinkan semua simbol hukum, tetapi saya tidak dapat menemukan daftar resmi karakter yang dilarang. Akal sehat mengatakan kepada saya bahwa tebasan adalah ilegal, tetapi jika saya harus menebak, saya akan mengatakan bahwa karakter plus itu legal. (sunting: Bukan!)

Saya sudah mengabaikan karakter periode karena kode saya secara otomatis menangani penambahan periode dan ekstensi file.

Hidup saya adalah bug.
sumber
17
Anda juga mungkin menemukan Retrocomputing berguna.
Bob
Coba buat folder di Windows dan beri tanda '?' dalam nama. Tooltip memberi tahu Anda karakter mana yang dilarang. Ini memberi Anda awal
:)
@Mixxiphoid tidak akan berfungsi karena kumpulan karakter yang diizinkan di Windows jauh lebih besar. Misalnya +,;[], ruang dan a-zdiizinkan di Windows tetapi tidak DOS. Explorer memberi saya kesalahan "Nama file tidak boleh mengandung karakter berikut \ / : * ? " < > |yang hanya merupakan bagian dari karakter yang dilarang di DOS
phuclv
1
@ phuclv itu sebabnya saya mengatakan 'Ini memberimu permulaan' dan juga mengapa ini adalah komentar dan bukan jawaban.
Mixxiphoid
Mengapa semua simbol MS-DOS? Mengapa tidak mempertimbangkan aturan OS lama lainnya?
jpmc26

Jawaban:

30

Ringkasan singkat dapat ditemukan di Wikipedia :

Karakter legal untuk nama file DOS meliputi:

  • Huruf besar A-Z
  • Angka 0-9
  • Spasi (meskipun spasi di nama basis atau ekstensi dianggap padding dan bukan bagian dari nama file, juga nama file dengan spasi di dalamnya harus dilampirkan dalam tanda kutip untuk digunakan pada baris perintah DOS, dan jika DOS perintah dibangun secara terprogram, nama file harus ditutup dengan tanda kutip empat kali lipat jika dilihat sebagai variabel dalam program yang membangun perintah DOS.)
  • ! # $ % & ' ( ) - @ ^ _ ` { } ~
  • Nilai 128–255 (meskipun jika layanan NLS aktif dalam DOS, beberapa karakter yang ditafsirkan sebagai huruf kecil tidak valid dan tidak tersedia)

Ini tidak termasuk karakter ASCII berikut:

  • " * + , / : ; < = > ? \ [ ] | [9]
  • Windows / MS-DOS tidak memiliki karakter shell escape
  • .(U + 002E. Pemberhentian penuh) di dalam bidang nama dan ekstensi, kecuali dalam. dan .. entri (lihat di bawah)
  • Huruf kecil a- z(disimpan sebagai A – Z pada FAT12 / FAT16)
  • Kontrol karakter 0–31
  • Nilai 127 (DEL) [ragu-ragu - diskusikan]

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

Dan inilah yang dikatakan panduan pengguna MS-DOS 6 secara resmi

Menamai File dan Direktori

Setiap file dan direktori, kecuali direktori root pada setiap drive, harus memiliki nama. Daftar berikut ini merangkum aturan untuk penamaan file dan direktori. Nama file dan direktori:

  • Panjangnya bisa hingga delapan karakter. Selain itu, Anda dapat memasukkan ekstensi hingga tiga karakter.
  • Tidak peka huruf besar-kecil. Tidak masalah apakah Anda menggunakan huruf besar atau kecil ketika Anda mengetiknya.
  • Hanya dapat berisi huruf A hingga Z, angka 0 hingga 9, dan karakter khusus berikut: garis bawah ( _), tanda sisipan ( ^), tanda dolar ( $), tilde ( ~), tanda seru ( ), tanda angka ( !), tanda angka ( #), tanda persen ( %), ampersand ( &), tanda hubung ( ), tanda -kurung ( {}), pada tanda ( @), tanda kutip tunggal ( `), tanda kutip ( '), dan tanda kurung (). Tidak ada karakter khusus yang dapat diterima.
  • Tidak dapat berisi spasi, koma, garis miring terbalik, atau titik (kecuali periode yang memisahkan nama dari ekstensi).
  • Tidak dapat identik dengan nama file atau subdirektori lain di direktori yang sama.

Ini dari PC-DOS 7:

Nama yang Anda tetapkan untuk file harus memenuhi kriteria berikut:

  • Itu dapat berisi tidak lebih dari delapan karakter.
  • Ini dapat terdiri dari huruf A hingga Z, angka 0 hingga 9, dan karakter khusus berikut:

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

Catatan: Tidak ada karakter khusus yang dapat diterima.

  • Nama tidak boleh berisi spasi, koma, garis miring terbalik, atau titik (kecuali periode yang memisahkan nama dari ekstensi).
  • Nama tidak boleh salah satu dari nama file yang dicadangkan berikut: CLOCK $, CON, AUX, COM1, COM2, COM3, COM4, ​​LPT1, LPT2, LPT3, LPT3, LPT4, NUL, dan PRN.
  • Tidak boleh nama yang sama dengan file lain dalam direktori.

Panduan Pengguna - PC DOS 7

Byte pertama nama tidak boleh 0x20 (spasi). Nama atau ekstensi pendek diisi dengan spasi. Karakter khusus ASCII 0x22 ( "), 0x2a ( *), 0x2b ( +), 0x2c ( ,), 0x2e ( .), 0x2f ( /), 0x3b ( :), 0x3b ( ;), 0x3c ( <), 0x3d ( =), 0x3e ( >), 0x3f ( ?) , 0x3f ( ), 0x3f ( ), , 0x5b ( [), 0x5c ( \), 0x5d ( ]), 0x7c ( |) tidak diizinkan.

Sistem file FAT

Jika Anda juga tertarik dengan MS-DOS 5.0 maka ini dia .

phuclv
sumber
11
Mungkin perlu dicatat bahwa meskipun mereka hanya berisi karakter yang valid nama file khusus CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, dan LPT9juga tidak diizinkan (lihat di sini )
Thomas Schremser
3
@ThomasSchremser "Jangan gunakan", "Hindari" dan "Tidak dianjurkan" tidak sama dengan "tidak diizinkan".
RobIII
1
@RobIII Ya tapi mereka menautkan ke dokumentasi "Windows> Desktop", bukan ke dokumentasi "MS-DOS". The wiki untuk DOS mengatakan, "Ada nama-nama perangkat yang dipesan di DOS yang tidak dapat digunakan sebagai nama file tanpa ekstensi seperti yang ditempati oleh built-in perangkat karakter". Dengan kata lain, tidak diizinkan dalam DOS dan beberapa versi Windows, dan tidak direkomendasikan dalam versi Windows lainnya.
Quantic
Sangat menarik bahwa `disebut sebagai kutipan tunggal. Saya selalu mendengar itu disebut backtick, dan '(apa yang mereka sebut (tidak salah) sebuah tanda kutip) sebagai kutipan tunggal.
ale10ander
2
@ ale10ander ya itu mengejutkan saya. Saya selalu benci bahwa banyak orang menggunakannya untuk tanda kutip (seperti dalam I`m) atau bagian awal dari kutipan. Sebagai contoh, dokumentasi GNU selalu menulis `seperti ini 'yang sangat jelek dan kurang dapat dibaca oleh saya
phuclv
12

Sebenarnya, sebagai pemrogram aplikasi MS / PC / DR-DOS, Anda seharusnya menanyakan sistem operasi untuk informasi ini. INT 0x21 dengan AX = 0x6505 mengembalikan pointer ke apa yang disebut FCHARtabel NLS untuk negara dan halaman kode Anda. Tabel ini mencantumkan serangkaian karakter dan serangkaian karakter lebih lanjut yang mengakhiri nama file.

Secara teori bervariasi menurut negara dan halaman kode. Tetapi fakta bahwa itu tidak secara resmi dibawa ke dalam OS / 2 Control Program API dan fakta bahwa FreeDOS memiliki 1 tabel di semua codepages dan negara-negara menunjukkan bahwa sebagian besar invarian dalam praktiknya.

Bacaan lebih lanjut

JdeBP
sumber
10

Saya menemukan ini dalam manual untuk MS-DOS 3.3. Saya menjalankan 6.22, tetapi mungkin masih berlaku. Saya salah tentang '+' diizinkan.

Masukkan deskripsi gambar di sini

Hidup saya adalah bug.
sumber
2
Manual dari back-in-the-day lebih dapat diandalkan daripada Wikipedia
Stewart
@ Mulailah yang penting adalah kutipan di Wikipedia, bukan Wikipedia itu sendiri. Jika ragu, cukup periksa catatan kaki dan referensi di artikel \ @Mylifeisabug Saya baru saja menambahkan manual MS-DOS 6
phuclv
3

Jika Anda hanya ingin memvalidasi nama file, Anda mungkin ingin menggunakan INT 21H/AH=60H (TRUENAME - CANONICALIZE FILENAME OR PATH)setelah memastikan bahwa nama file yang disahkan tidak memiliki titik dua atau backslash (yang dapat diperlakukan sebagai huruf drive dan direktori): fungsi tersebut mengambil nama file yang Anda usulkan dan mencoba mengkanonikkan itu dengan huruf besar huruf dan memeriksa untuk karakter yang tidak valid (itu juga menambahkan huruf drive / nama server dan path.)

Dalam pseudocode:

If !(filename contains {"/", "\", ".", ":"})
    Canonicalize filename (INT 21H/AH=60H)
    If !(CF is set) filename is valid
Filename is not valid
ErikF
sumber