Windowsのファイル名に使えない記号は9種類
会議メモを「15:30_打ち合わせ内容.txt」みたいな名前で保存したくてもできませんよね。もちろん半角の話で全角は可能です。

Windowsのファイルやフォルダーの名前には次の9つの記号が使えないと公式に定められています。
\ / : * ? " < > |
これはMicrosoftの公式ドキュメント「Naming Files, Paths, and Namespaces」に明記されているルールです。さらにASCIIのNUL文字(値がゼロの文字)と制御文字と呼ばれる1〜31の範囲の文字も名前には使えないとされています。
適当に決められているわけではなく、どれもWindowsの内部ですでに「特殊な意味」を持ってしまっている記号です。ファイル名に混ぜてしまうとOSがどこまでがファイル名でどこからが別の指示なのか判断できなくなってしまうんですね。
それぞれの記号にはちゃんと役割がある
| 記号 | 本来の役割 | ファイル名に使えない理由 |
|---|---|---|
\ | パスの区切り文字 | フォルダとフォルダ、フォルダとファイルの階層を区切るために使われる |
/ | コマンドのオプション指定文字 | DOSコマンドのオプション指定文字に使われる |
: | ドライブ名の区切り文字 | ドライブ指定や代替データストリームの区切りに使われる |
* | ワイルドカード(複数文字) | *.txt のように任意の文字列をまとめて表すために使われる |
? | ワイルドカード(1文字) | data?.csv のように任意の1文字を表すために使われる |
" | パスを囲む引用符 | コマンドライン上で文字列やパスを囲む引用符に使われる |
< > | 入出力のリダイレクト記号 | コマンドの出力をファイルへ書き出したり読み込んだりするために使われる |
| | パイプ記号 | あるコマンドの出力を別のコマンドへそのまま渡すために使われる |
*は複数文字、?は1文字だけのワイルドカードです。たとえばテキストファイルだけを一覧表示したいときは、こんな風に使いますよね。
dir *.txtもし*がファイル名にそのまま使えてしまったら、このコマンドのどこまでがファイル名を指していてどこからがワイルドカードなのか、Windows自身も判断できなくなってしまいます。
"はスペースを含むパスをコマンドラインで扱うときによく登場します。パスにスペースが含まれる場合は""で囲むのが基本です。
ワイルドカードやパスを実際にコマンドで使いたい方はPowerShellの基本操作もまとめています。
「/」だけ毛色の違う理由がある
一覧の中で「/」だけちょっと不思議に感じませんか。Windowsのパス区切りは基本的に\なので、「/」まで使えなくする理由がぱっと思いつきにくいんですよね。
これは元MicrosoftエンジニアだったLarry Osterman氏が自身のブログで明かしていた話で、発端はMS-DOS 1.0の時代までさかのぼります。当時DOSに付属していたユーティリティの多くはIBMが書いたもので、dir /wのように「/」をオプション(スイッチ)指定の記号として使う設計になっていました。
dir /wその後DOS 2.0でディレクトリの概念が追加された際、Microsoft側は「/」をパス区切りに使いたかったようなのですが、既存の互換性を重視するIBM側がこれを譲らなかったそうです。そこで見た目が似ている\を代わりに採用することになった、という経緯だったみたいです。
つまり「/」がファイル名に使えないのはWindowsのパス区切り文字だからではなく「もともとオプション指定の記号として予約されていた」という、DOS時代からの経緯が理由というわけですね。
「:」にはもうひとつ隠れた使い道がある
:はドライブ名の区切りとして使われている、という説明で終わってしまうことが多いのですが、実はNTFSにはもうひとつ:を使う機能があります。「代替データストリーム(Alternate Data Streams)」と呼ばれるもので、ファイル名.txt:ストリーム名のように:区切りで1つのファイルに複数のデータ領域を持たせられる仕組みです。
Microsoftの公式ドキュメントでも制御文字(1〜31)は基本的にファイル名に使えないものの、この代替データストリームの中でだけは例外的に許可されると明記されています。ふだん意識することはあまりないですが:が特別扱いされている裏にはこういう理由も隠れているんですね。
記号だけじゃない、使えない「単語」もある
禁止されているのは記号だけではありません。意外や意外、次の単語もファイル名やフォルダー名として単体では使えません(拡張子を付けても同じ扱いになります)。
CON, PRN, AUX, NUL, COM1〜COM9, LPT1〜LPT9
たとえばフォルダに「CON」という名前を付けようとしても保存できません。実際にやってみると下記のようになりました。

これらはWindowsが生まれる前、CP/MやMS-DOSの時代に「周辺機器そのものを指す名前」として使われていた名残です。CONはコンソール(画面とキーボード)、PRNはプリンター、AUXは補助的なシリアルポート、NULは何も出力しない仮想デバイスをそれぞれ指していました。COM1〜9はシリアルポート、LPT1〜9はプリンターポートですね。当時はcopy myfile.txt prnのように書くだけで、そのままプリンターへ送れる仕組みだったわけです。Windowsは今もこの互換性を引き継いでいるため、これらの名前が予約されたまま残っています。
ちなみに公式ドキュメントには、COM¹やLPT²のような上付き文字の数字も同じ扱いで予約されていると書かれています。まさか上付き文字まで気にする人はなかなかいない気がしますが、律儀に予約されているのは面白いポイントですね。
Windowsの仕組みや設定、よくあるトラブルをまとめて確認したい方はこちらもどうぞ。

スペースやピリオドで終わる名前もNG
記号や予約語とは別に名前の末尾にスペースやピリオドを置くこともできません。これはファイルシステムそのものの制限というより、エクスプローラーやWindowsのシェル側が受け付けていないだけのようで、公式ドキュメントでもその旨が説明されています。ちなみに先頭にピリオドを置くのは問題なく「.gitignore」のような名前は普通に作成できます。Linuxとかだと隠しファイルになるアレですね。
身近なIT用語の「なんで?」をゆるく知りたい方はIT雑学・ぷちQAカテゴリもあわせてどうぞ。



