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


16

x86-16アセンブリ言語でファイル名I / Oプロシージャを書いています。キーボードから8文字(長いファイル名をサポートする必要はありません)を受け取り、画面上のテキスト入力フィールドに出力します。

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

すべての法的記号を許可したいのですが、禁止されているキャラクターの公式リストが見つかりません。スラッシュは違法であると常識は教えてくれますが、推測しなければならないのであれば、プラス記号は合法だと言えます。(編集:違います!)

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


17
また、Retrocomputingが役立つ場合もあります。
ボブ

Windowsでフォルダーを作成して、「?」名前に。ツールチップは、禁止されている文字を示します。これはあなたにスタートを与えます:)...
Mixxiphoid

@Mixxiphoidは、Windowsで許可されている文字セットがはるかに大きいため機能しません。たとえば+,;[]、スペースとa-zWindowsでは許可されていますが、DOSでは許可されていません。エクスプローラーで、「ファイル名に次の文字\ / : * ? " < > |を含めることはできません。これは、DOSで禁止されている文字のサブセットにすぎません
-phuclv

1
@phuclvだからこそ、「これがあなたに出発点を与える」と言った理由であり、またこれがコメントではなく答えではない理由でもあります。
-Mixxiphoid

なぜすべてのMS-DOSシンボルですか?他の古いOSルールも考慮しないのはなぜですか?
jpmc26

回答:


30

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

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

  • 大文字AZ
  • 数字0-9
  • スペース(ベース名または拡張子の末尾のスペースは、ファイル名の一部ではなくパディングと見なされますが、スペースを含むファイル名は、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にも興味がある場合はここにあります。


11
それは価値があるにもかかわらず、彼らは唯一の有効な文字に特別なファイル名が含まれていることに注意かもしれませんCONPRNAUXNULCOM1COM2COM3COM4COM5COM6COM7COM8COM9LPT1LPT2LPT3LPT4LPT5LPT6LPT7LPT8、とLPT9も許可されていません(参照ここ
トーマスSchremser

3
@ThomasSchremser「使用しない」、「避ける」、「推奨しない」は「許可しない」と同じではありません。
RobIII

1
@RobIIIはい。ただし、「MS-DOS」ドキュメントではなく、「Windows> Desktop」ドキュメントにリンクしています。DOSwikiには、「DOSには予約済みのデバイス名があり、拡張子に関係なくファイル名として使用できないため、組み込みの文字デバイスが使用されています」とあります。つまり、DOSおよびWindowsの一部のバージョンでは許可されておらず、他のWindowsバージョンでは推奨されていません。
量的

`が一重引用符と呼ばれるのは興味深いことです。私はいつもそれがバックティックと呼ばれ、 '(彼らが(誤ってではない)アポストロフィと呼んでいるもの)を一重引用符として聞いていました。
ale10ander

2
@ ale10anderうん、それは私を驚かせた。多くの人がアポストロフィ(I`mのように)または引用の開始部分に使用することを常に嫌っていました。例えば、GNUのドキュメンテーションはいつも私に非常に醜いと読みにくくしている。こののような`書き込み
phuclv

12

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

理論的には、国およびコードページによって異なります。しかし、OS / 2 Control Program APIに正式に引き継がれなかったという事実と、FreeDOSがすべてのコードページと国で1つのテーブルを持っているという事実は、実際にはほとんど不変であることを示しています。

参考文献


10

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

ここに画像の説明を入力してください


2
過去のマニュアルはウィキペディアよりも信頼性が高い
スチュワート

@Stewartで重要なのは、Wikipedia自体ではなく、Wikipediaの引用です。ちょうど記事の脚注や参照をチェック疑問がある場合は、\ @Mylifeisabug私はちょうどMS-DOS 6マニュアル追加しました
phuclv

3

ファイル名を検証するだけの場合は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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.