web-dev-qa-db-ja.com

どの文字がMS-DOSファイル名に無効ですか?

私はx86-16アセンブリ言語でファイル名の入出力手続きを書いています。キーボードから8文字(長いファイル名をサポートする必要はありません)を取り、画面上のテキスト入力フィールドにそれらを印刷します。

現時点で私は数字、大文字/小文字、アンダースコア、そしてハイフンを許可しています。

すべての合法的な記号を許可したいのですが、禁止文字の公式リストが見つかりません。常識ではスラッシュは違法であると言われていますが、推測しなければならない場合は、プラス文字が正当であると言えます。 (編集:そうではありません!)

私のコードではピリオドとファイル拡張子の追加を自動的に処理しているので、ピリオド文字は無視しています。

16

簡潔な要約を見つけることができます ウィキペディア上

DOSファイル名の有効な文字には次のものがあります。

  • 大文字AZ
  • 番号09
  • スペース(ベース名または拡張子の末尾のスペースは、ファイル名の一部ではなくパディングと見なされますが、スペースを含むファイル名は、DOSコマンドラインで使用する引用符で囲む必要があります。コマンドはプログラムで作成されます。DOSコマンドを作成するプログラム内で変数として表示する場合、ファイル名は4重引用符で囲む必要があります。
  • ! # $ % & ' ( ) - @ ^ _ ` { } ~
  • 値128〜255(ただし、NLSサービスがDOSでアクティブになっている場合、小文字として解釈される一部の文字は無効で使用不可です)

これにより、次のASCII文字が除外されます。

  • " * + , / : ; < = > ? \ [ ] | [9]
  • Windows/MS-DOSにはシェルエスケープ文字がありません
  • 名前フィールドと拡張子フィールド内の.(U + 002E。ストップ)を除く。および..エントリ(以下を参照)
  • 小文字az(FAT12/FAT16にA〜Zとして保存)
  • 制御文字0〜31
  • 値127(DEL)[疑わしい-話し合う]

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

そして、ここにMS-DOS 6ユーザーガイドが公式に言ったことがある

ファイルとディレクトリの命名

各ドライブのルートディレクトリを除くすべてのファイルとディレクトリには、名前が必要です。次のリストは、ファイルとディレクトリの命名規則をまとめたものです。ファイル名とディレクトリ名:

  • 長さは最大8文字です。さらに、最大3文字の拡張子を含めることができます。
  • 大文字と小文字は区別されません。入力時に大文字を使用するか小文字を使用するかは関係ありません。
  • 文字A〜Z、数字0〜9、および次の特殊文字のみを含めることができます。アンダースコア(_)、キャレット(^)、ドル記号($)、チルダ(~)、感嘆符(!)、番号記号(#)、パーセント記号(%)、アンパサンド(&)、ハイフン(-)、中括弧({})、アットマーク(@)、単一引用符(`)、アポストロフィ(')、および括弧()。他の特殊文字は使用できません。
  • スペース、コンマ、バックスラッシュ、またはピリオドを含めることはできません(名前と拡張子を区切るピリオドを除く)。
  • 同じディレクトリ内の別のファイルまたはサブディレクトリの名前と同じにすることはできません。

これはPC-DOS 7からのものです。

ファイルに割り当てる名前は、次の基準を満たす必要があります。

  • 8文字を超えることはできません。
  • 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にも興味がある場合は、 ここにあります です。

30
phuclv

厳密に言えば、MS/PC/DR-DOSアプリケーションプログラマとしては、オペレーティングシステムにこの情報を要求することになっています。 AX = 0x6505を指定したINT 0x21は、使用している国とコードページのいわゆるFCHAR NLSテーブルへのポインタを返します。この表はファイル名を終える文字の範囲そしてそれ以上の文字のセットをリストしたものです。

理論的には、国やコードページによって異なります。しかし、それが正式にOS/2制御プログラムAPIに引き継がれなかったという事実と、 FreeDOSがすべてのコードページと国にわたって1つのテーブルを持つという事実 実際にはほとんど不変です。

参考文献

12
JdeBP

私はこれをMS-DOS 3.3のマニュアルで見つけました。私は6.22を実行していますが、それはおそらくまだ適用されます。 '+'が許可されていることについて間違っていました。

Enter image description here

10

単にファイル名を検証したい場合は、渡されたファイル名にコロンやバックスラッシュがないことを確認してから INT 21H/AH=60H (TRUENAME - CANONICALIZE FILENAME OR PATH) を使用することをお勧めします。ドライブ文字とディレクトリとして扱われます):この関数はあなたが提案したファイル名を取り、文字を大文字にして無効な文字をチェックすることで正規化しようとします(ドライブ文字/サーバ名とパスも追加します)

疑似コードの場合:

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