อักขระใดไม่ถูกต้องสำหรับชื่อไฟล์ MS-DOS


16

ฉันกำลังเขียนขั้นตอนชื่อไฟล์ I / O ในภาษาแอสเซมบลี x86-16 ใช้อักขระแปดตัว (ฉันไม่ต้องการสนับสนุนชื่อไฟล์แบบยาว) จากแป้นพิมพ์และพิมพ์ไปยังช่องป้อนข้อความบนหน้าจอ

ในขณะนี้ฉันอนุญาตตัวเลขตัวอักษรตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็กขีดล่างและยัติภังค์

ฉันต้องการอนุญาตสัญลักษณ์ทางกฎหมายทั้งหมด แต่ไม่สามารถค้นหารายชื่อตัวละครที่ถูกแบนได้ สามัญสำนึกบอกฉันว่าเครื่องหมายทับนั้นผิดกฎหมาย แต่ถ้าฉันต้องเดาฉันจะบอกว่าตัวละครบวกนั้นถูกกฎหมาย (แก้ไข: ไม่ใช่!)

ฉันไม่สนใจอักขระช่วงเวลาเนื่องจากรหัสของฉันจัดการการต่อท้ายและนามสกุลไฟล์โดยอัตโนมัติ


17
คุณอาจพบว่าการคำนวณ retrocom นั้นมีประโยชน์
บ๊อบ

ลองสร้างโฟลเดอร์ใน Windows แล้วใส่ '?' ในชื่อ. เคล็ดลับเครื่องมือบอกคุณว่าต้องห้ามใช้อักขระใด สิ่งนี้จะช่วยให้คุณเริ่มต้น
:)

@Mixxiphoid ที่ใช้ไม่ได้เพราะชุดของอักขระที่ได้รับอนุญาตใน Windows มีขนาดใหญ่กว่ามาก ตัวอย่างเช่น+,;[]เว้นวรรคและa-zได้รับอนุญาตใน Windows แต่ไม่ใช่ DOS Explorer ทำให้ฉันมีข้อผิดพลาด "ชื่อไฟล์ไม่สามารถมีตัวอักษรต่อไปนี้\ / : * ? " < > |ซึ่งเป็นเพียงส่วนหนึ่งของตัวอักษรที่ถูกแบนใน DOS
phuclv

1
@phuclv นั่นคือเหตุผลที่ฉันพูดว่า 'นี่เป็นการเริ่มต้นของคุณ' และทำไมนี่ถึงเป็นความคิดเห็นและไม่ใช่คำตอบ
Mixxiphoid

ทำไมสัญลักษณ์ MS-DOS ทั้งหมด? ทำไมไม่ลองพิจารณากฎ OS เก่าอื่น ๆ ด้วย
jpmc26

คำตอบ:


30

บทสรุปที่กระชับสามารถพบได้ใน Wikipedia :

อักขระทางกฎหมายสำหรับชื่อไฟล์ DOS มีดังต่อไปนี้:

  • ตัวอักษรตัวพิมพ์ใหญ่A-Z
  • ตัวเลข0-9
  • Space (แม้ว่าช่องว่างต่อท้ายในชื่อฐานหรือส่วนขยายนั้นถือว่าเป็นช่องว่างภายในและไม่ใช่ส่วนหนึ่งของชื่อไฟล์ชื่อไฟล์ที่มีช่องว่างในนั้นจะต้องอยู่ในเครื่องหมายคำพูดเพื่อใช้กับบรรทัดคำสั่ง DOS และหาก DOS คำสั่งถูกสร้างโดยทางโปรแกรมชื่อไฟล์จะต้องอยู่ในเครื่องหมายคำพูดสี่เท่าเมื่อดูเป็นตัวแปรภายในโปรแกรมที่สร้างคำสั่ง DOS)
  • ! # $ % & ' ( ) - @ ^ _ ` { } ~
  • ค่า 128–255 (แม้ว่าถ้าบริการ NLS เปิดใช้งานใน DOS ตัวละครบางคนตีความว่าเป็นตัวพิมพ์เล็กไม่ถูกต้องและไม่พร้อมใช้งาน)

สิ่งนี้ไม่รวมอักขระ ASCII ต่อไปนี้:

  • " * + , / : ; < = > ? \ [ ] | [9]
  • Windows / MS-DOS ไม่มีอักขระยกเว้นเชลล์
  • .(U + 002E. full stop) ภายในฟิลด์ชื่อและส่วนขยายยกเว้นใน และ .. รายการ (ดูด้านล่าง)
  • ตัวอักษรพิมพ์เล็กa- z(เก็บไว้เป็น A – Z ใน FAT12 / FAT16)
  • อักขระควบคุม 0–31
  • ค่า 127 (DEL) [น่าสงสัย - อภิปราย]

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

และนี่คือสิ่งที่คู่มือผู้ใช้ของ MS-DOS 6 กล่าวอย่างเป็นทางการ

การตั้งชื่อไฟล์และไดเรกทอรี

ทุกไฟล์และไดเรกทอรียกเว้นไดเรกทอรีรากในแต่ละไดรฟ์จะต้องมีชื่อ รายการต่อไปนี้สรุปกฎสำหรับการตั้งชื่อไฟล์และไดเรกทอรี ชื่อไฟล์และไดเรกทอรี:

  • สามารถยาวได้สูงสุดแปดตัวอักษร นอกจากนี้คุณสามารถรวมส่วนขยายได้สูงสุดสามอักขระ
  • ไม่คำนึงถึงขนาดตัวพิมพ์ ไม่สำคัญว่าคุณจะใช้ตัวอักษรตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กเมื่อคุณพิมพ์
  • สามารถมีได้เฉพาะตัวอักษร A ถึง Z ตัวเลข 0 ถึง 9 และอักขระพิเศษต่อไปนี้: ขีดล่าง ( _), คาเร็ต ( ^), เครื่องหมายดอลลาร์ ( $), เครื่องหมายตัวหนอน ( ~), เครื่องหมายตัวหนอน ( ), เครื่องหมายอัศเจรีย์ ( !), เครื่องหมายตัวเลข ( #), เครื่องหมายเปอร์เซ็นต์ ( %) เครื่องหมาย ( &) ยัติภังค์ ( -) วงเล็บ ( {}) ที่เข้าสู่ระบบ ( @) เครื่องหมายคำพูดเดียว ( `) apostrophe ( ') ()และวงเล็บ ไม่รับอักขระพิเศษอื่น ๆ
  • ไม่สามารถมีช่องว่างเครื่องหมายจุลภาคเครื่องหมายแบ็กสแลชหรือจุด (ยกเว้นช่วงเวลาที่แยกชื่อออกจากส่วนขยาย)
  • ต้องไม่เหมือนกันกับชื่อของไฟล์หรือไดเรกทอรีย่อยอื่นในไดเรกทอรีเดียวกัน

นี่คือจาก PC-DOS 7:

ชื่อที่คุณกำหนดให้กับไฟล์ต้องเป็นไปตามเกณฑ์ต่อไปนี้:

  • สามารถมีอักขระได้ไม่เกินแปดตัว
  • สามารถประกอบด้วยตัวอักษร A ถึง Z ตัวเลข 0 ถึง 9 และอักขระพิเศษต่อไปนี้:

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

หมายเหตุ: ไม่รับอักขระพิเศษอื่น ๆ

  • ชื่อต้องไม่มีช่องว่างเครื่องหมายจุลภาคแบ็กสแลชหรือจุด (ยกเว้นช่วงเวลาที่แยกชื่อออกจากส่วนขยาย)
  • ชื่อไม่สามารถเป็นหนึ่งในชื่อไฟล์ที่สงวนไว้ดังต่อไปนี้: CLOCK $, CON, AUX, COM1, COM2, COM3, COM4, ​​LPT1, LPT2, LPT3, LPT4, NUL และ PRN
  • ไม่สามารถเป็นชื่อเดียวกันกับไฟล์อื่นภายในไดเรกทอรี

คู่มือผู้ใช้ - PC DOS 7

ไบต์แรกของชื่อต้องไม่เป็น 0x20 (เว้นวรรค) ชื่อสั้นหรือนามสกุลมีเบาะด้วยช่องว่าง อักขระพิเศษ ASCII 0x22 ( ") 0x2a ( *) 0x2b ( +) 0x2c ( ,) 0x2e ( .) 0x2f ( /) 0x3a ( :) 0x3b ( ;) 0x3c ( <) 0x3d ( =) 0x3e ( >) 0x3F ( ?) , 0x5b ( [), 0x5c ( \), 0x5d ( ]), 0x7c ( |) ไม่ได้รับอนุญาต

ระบบไฟล์ FAT

หากคุณสนใจยังอยู่ใน MS-DOS 5.0 แล้วที่นี่มันเป็น


11
มันอาจจะเป็นที่น่าสังเกตว่าถึงแม้พวกเขาเพียง แต่มีอักขระที่ถูกต้องชื่อไฟล์พิเศษCON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8และLPT9ยังไม่ได้รับอนุญาต (ดูที่นี่ )
โทมัส Schremser

3
@ThomasSchremser "ห้ามใช้", "หลีกเลี่ยง" และ "ไม่แนะนำ" ไม่เหมือนกับ "ไม่อนุญาต"
RobIII

1
@RobIII ใช่ แต่พวกเขาเชื่อมโยงกับเอกสาร "Windows> Desktop" ไม่ใช่เอกสาร "MS-DOS" วิกิพีเดียสำหรับ DOSกล่าวว่า "มีชื่ออุปกรณ์ที่สงวนไว้ใน DOS ที่ไม่สามารถนำมาใช้เป็นชื่อไฟล์โดยไม่คำนึงถึงการขยายที่พวกเขาจะถูกครอบครองโดยในตัวอุปกรณ์ตัวอักษร" กล่าวอีกนัยหนึ่งไม่อนุญาตใน DOS และ Windows บางรุ่นและไม่แนะนำใน Windows รุ่นอื่น
Quantic

มันน่าสนใจที่ `ถูกอ้างถึงเป็นคำพูดเดียว ฉันได้ยินมาเสมอว่ามันเรียกว่า backtick และ '(สิ่งที่พวกเขาเรียกว่าอะพอสโทรฟี (ไม่ถูกต้อง) เป็นคำพูดเดียว
ale10ander

2
@ ale10ander ใช่นั่นทำให้ฉันประหลาดใจ ฉันเกลียดเสมอว่ามีหลายคนที่ใช้มันสำหรับอะพอสโทรฟี (เช่นในฉัน) หรือส่วนเริ่มต้นของคำพูด ตัวอย่างเช่นเอกสารของ GNU มักเขียน 'แบบนี้' ซึ่งน่าเกลียดมากและอ่านได้ง่ายสำหรับฉัน
phuclv

12

พูดอย่างเคร่งครัดในฐานะที่เป็นโปรแกรมเมอร์แอปพลิเคชัน MS / PC / DR-DOS คุณควรถามระบบปฏิบัติการสำหรับข้อมูลนี้ INT 0x21 พร้อม AX = 0x6505 ส่งคืนตัวชี้ไปยังFCHARตาราง NLS ที่เรียกว่าสำหรับประเทศและรหัสหน้าของคุณ ตารางนี้แสดงรายการช่วงของอักขระและชุดอักขระเพิ่มเติมที่ยกเลิกชื่อไฟล์

ในทางทฤษฎีมันแตกต่างกันไปตามประเทศและรหัสหน้า แต่ความจริงที่ว่ามันไม่ได้ถูกนำไปใช้อย่างเป็นทางการใน OS / 2 Control Program API และความจริงที่ว่าFreeDOS นั้นมีตาราง 1 ตารางทั่วทุกเพจรหัสและประเทศต่างๆ

อ่านเพิ่มเติม


10

ฉันพบสิ่งนี้ในคู่มือสำหรับ MS-DOS 3.3 ฉันใช้งาน 6.22 แต่มันอาจจะยังคงใช้ได้ ฉันได้รับอนุญาตผิด '+'

ป้อนคำอธิบายภาพที่นี่


2
คู่มือจาก back-in-the-day นั้นมีความน่าเชื่อถือมากกว่า Wikipedia
Stewart

@ เริ่มต้นสิ่งที่สำคัญคือคำพูดใน Wikipedia ไม่ใช่ Wikipedia เอง หากมีข้อสงสัยเพียงแค่ตรวจสอบเชิงอรรถและการอ้างอิงในบทความ \ @Mylifeisabug ฉันได้เพิ่มเพียง MS-DOS 6 คู่มือ
phuclv

3

หากคุณต้องการตรวจสอบความถูกต้องของชื่อไฟล์คุณอาจต้องการใช้งานINT 21H/AH=60H (TRUENAME - CANONICALIZE FILENAME OR PATH)หลังจากตรวจสอบให้แน่ใจว่าชื่อไฟล์ที่ส่งผ่านไม่มีเครื่องหมายโคลอนหรือแบ็กสแลช (ซึ่งอาจถือว่าเป็นอักษรชื่อไดรฟ์และไดเรกทอรี): ฟังก์ชั่น โดยเพิ่มตัวอักษรและตรวจสอบอักขระที่ไม่ถูกต้อง (นอกจากนี้ยังเพิ่มตัวอักษรชื่อไดรฟ์ / เซิร์ฟเวอร์และพา ธ )

ใน pseudocode:

If !(filename contains {"/", "\", ".", ":"})
    Canonicalize filename (INT 21H/AH=60H)
    If !(CF is set) filename is valid
Filename is not valid
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.