32bit Windowsのファイル名に関して


Windows XP以前の時代の情報が中心です。。。最新の情報は、新しいMSDN等で確認してください。。
Windows95以降(32ビットWindows) において、ファイル名の規則といえば

・ 255文字までの長さのファイル名が付けられる
 や
・  \ / , ; : * ? " < > | の11種類の文字はファイル名には使用できない

というのが一般的に知られています。

しかし、果たして本当でしょうか。



このページは、私が「お〜瑠璃ね〜む」を作成する過程で、 Windowsのファイル名に関する規則やバグ仕様に悩まされたことで 怒りにまかせて作成することにしました。


【まず最初に】

当たり前のことですが、完璧なソフトウェアというものは存在しません。
Windowsであればなおさらであっても、完璧ではありません。

Windowsで使われるファイル名に関してもしかり。 普通に扱う分には何も問題がないように思われますが、 細かく見ていくと、実はこれも同じように、完璧ではないのです。

Windowsでは、表面上に現れないバックグラウンドの部分で、ファイル名についての様々な処理をしています。
これは、ユーザーがファイル名を付けるときに、ファイルシステムを意識しないで使えるようにと、マイクロソフトが行っている隠蔽配慮なのかもしれません。
しかし、、、


【キホンのキ】

まずは用語です。

 8.3 形式  ロングファイル名
 Windows 9x 系
 Windows NT 系

次に一般的に知られていることです。

「MS-DOSや、Windows3.1では、ファイル名は8.3形式でした。しかし、Windows95以降(32ビット Windows)になって、255文字までのファイル名を付けることができるようになりました。」
↑ 正確に書かれていて何も問題ないようですが、実はかなり曖昧なんです。(後述)

「ファイル名には、\ / , ; : * ? " < > | の11個の文字は使用できません。」
↑ おもいっきりうそです。(後述)


【表示されない拡張子】

設定で、[登録されている拡張子は表示しない] のチェックを外しているのに、表示されない拡張子があります。
それは、".lnk"、".url"、".pif" です。
一度でもこれらの拡張子を持つファイル名を付けてしまうと、その拡張子が隠れてしまい、 もはやエクスプローラからは変更できなくなります。
(追加、cnf, mydocs, shs, shb, desklink, MAPIMail等 の拡張子も表示されないようです。)

【VFAT】

ロングファイル名が扱えるファイルシステムを、VFAT(Virtual File Allocation Table)といいます。
VFAT では、ユーザーは基本的にロングファイル名のみを扱いますが、システム内部的には 8.3 形式のファイル名も合わせて持っています。
Windows 9x 系Windows NT 系では、VFATの仕様が異なっています。
どのように異なっているかの詳細は分かりません。


【付けられないファイル名】

ファイル名に使用不可能な文字を一切使っていないのに、絶対に付けられないファイル名というのも存在します。
それは、以下のファイル名です。

CON, AUX, COMn (nは1〜9), LPTn (nは1〜9), PRN, NUL

拡張子を付けて、"CON.bmp","NUL.txt" 等にすることも出来ません。

#一昔前に "CONCON問題" というのがありましたから、CONは知ってる人も多いでしょう。 他にもこれだけあるのですね。

<応用編>

これらデバイスファイルは、MS-DOS時代に使われていたものですが、Windowsでも使えます。
例えば、コマンドプロンプトから、
echo "印刷テスト" > PRN
とすると、"印刷テスト" という文字がプリンタで印刷されるらしいです。(ちゃんと設定しないとダメですが)


【エクスプローラ上からは変更できないファイル名】

エクスプローラで変更できないファイル名があります。
1つ目は、先頭に ".(ドット)" のあるファイル名です。
ただし、既に先頭に "." のあるファイル名を、先頭に"."のないファイル名に変更することは可能です。

もう1つは、先頭に "半角スペース" のあるファイル名です。
このファイル名を付けようとすると、先頭の半角スペースが勝手に取り去られます。

これらは、エクスプローラからは変更できないだけで、WindowsAPI(プログラム)からであれば変更できます。


【使用できない文字のはずが】

Windowsでは、";(セミコロン)" や、",(カンマ)" のあるファイル名を付けることが出来ないとうたわれていますが、 普通に出来ちゃいます。
何故このようなウソが堂々とかかれていたのか分かりません。
非推奨ということだからかもしれません。

もちろん、MS-DOSでは使用できないのですが。


【半角スペース】

Windowsでは、半角スペースを含んだファイル名を付けることを禁止していません。
むしろ、Program Files や、Documents and Settings などOSが積極的に利用しています。
しかし、MS-DOS では引数を半角スペースで区切り文字として使用していました。 その名残かどうか分かりませんが、Windowsの一部のソフトウェアでは半角スペースのあるファイル名は正常に処理されません。

例えば、C:\Documents and Settings\user1\a.txt を開こうとしたら、
C:\Documents が開けません」などというエラーが出るソフトもあるようです。


【8.3 形式への変換規則】

Windows 9x 系Windows NT 系では、8.3 形式の名前への変換規則が違うようです。
そのため、Windows 98 と 2000 のデュアルブートなどでは、 一部のアプリケーションでエラーとなることもあるようです。


【ファイル名の長さ制限の違い】

Windows 9x 系 では、ファイル名自体の長さの制限は、絶対パスを含めずに255バイトです。
つまり、2バイト文字換算では、127文字までということになります。
それに対し、Windows NT 系 では、全角半角に関わらず(つまり2バイト文字でも)、255文字までOKです。

ファイル名の長さは 255文字と言いましたが、絶対パスでは260文字までの領域が確保されていて、終端文字1文字を除くと259文字まで保存できます。
つまり、ファイル名自体の255文字と、絶対パスを含めた長さの259文字のうち、より厳しい方の制限を受けることになります。
C:\ 等のドライブ直下にファイルを置く場合、全体の259文字に達する前に、ファイル名自体の255文字の制限を受けるため、全体は 3+255=258文字となります。
ドライブ直下以外は、ファイル名の255文字よりも全体の長さ259文字の制限が厳しくなり、付けられる名前が短くなります。



【英字 大文字/小文字のフラグ】

Windows 9x 系では、"8文字以内.3文字以内" で名前を付けると、自動的に 8.3 形式(全て大文字) のファイル名になります。
しかも、[フォルダオプション]で、[全て大文字の名前を使用する] のチェックを外していると、 先頭のみ大文字で、2文字目以降は小文字で表示されてしまいます。(内部的には全て大文字なのだが)

しかし、Windows NT 系では大文字と小文字を判別するフラグを持っていて、
8.3 形式で名前を付けても大文字と小文字が区別されます。


【大文字小文字 勝手に変更】

Windows NT 系では、ファイル名を変更したとき、大文字小文字が指定したものにならない場合があります。

例えば、下のように変更した場合です。
AbC.bmpxxx.bmpABC.BMP (勝手に AbC.bmp に戻ってしまう)
(1) (2)(3)

(1) は、"8文字.3文字" 以内のファイル名で、大文字と小文字が混在
(2) は、なんでもいい
(3) は、(1)のファイル名を、全て大文字か、全て小文字にしたもの

(1)は、8.3 形式 ではありません。なぜなら、全てが大文字ではないからです。 (3)こそが、(1)の 8.3 形式 です。
ファイル名を (3) に変更しようとしたとき、OSは ファイルシステム(or ディレクトリ?)が保持しているファイル名(1) と見比べて、 (3) が (1) の 8.3 形式だった場合、ファイル名は(1)に戻ってしまうということらしいです。
何故このようなロジックにしているのか全く分かりません。


【ファイル名保持(バグ仕様)】

ファイル名の情報は、ディレクトリに保存されています。

ロングファイル名の付いたファイルを MS-DOS で削除すると、 8.3 形式の情報だけが削除され、ロングファイル名の情報がディレクトリに残ります。


【256文字以上のファイル名(バグ仕様)】

「C:\フォルダA」以下に、
「longlonglonglong...省略...longlonglonglong.txt (150文字)
というファイルがあるとき、
「フォルダA」
のフォルダ名をエクスプローラから
longlonglong..省略...longlonglongフォルダA (全体で150文字)」というフォルダ名に変えます。
すると、
longlonglonglong...省略...longlonglonglong.txt は、 ファイル操作(オープン、リネーム、削除等)できなくなります。

これは、
C:\longlong...省略...longlongフォルダA\longlonglong...省略...longlonglong.txt
の絶対パスが259文字を超えてしまうために、正しく扱えなくなるからです。

これは、どうしようもない仕様なのかもしれません。
フォルダ名を変更するごとに、OSがそのフォルダ以下の全てのファイル名をチェックして、 259文字を超えないように入力できる文字を制限する仕様にしてもいいでしょうが、 そうすると、フォルダ名を変更するだけなのに、うるさいほどのディスクのアクセスと、 CPU使用率100%という悲しい結果となるでしょう。

それなら、各フォルダが、ファイル名の長さの最大値を内部で保持していたらいいのではないでしょうか。
例えば、
D:\aaa\zzz.txt
D:\aaa\bbb\yyy.txt
D:\aaa\bbb\xxxxx.txt
D:\aaa\ccc\wwwwww.txt
の4つのファイルのみがあったとすると、
aaaフォルダは、"\ccc\wwwwww.txt" の文字数である 15 という数字を保持し、
bbbフォルダは、"\xxxxx.txt" の文字数である 10 という数字を保持します。
これにより、
aaaフォルダは、259 - 15 - 3("D:\"の文字数)=241文字までしか入力できず、
bbbフォルダは、259 - 10 - 7("D:\aaa\"の文字数)=242文字までしか入力できません。

この仕様であれば、計算時間も問題なく済むと思うのですが、、どうでしょう?(採用されませんかね。。)


【ファイル名とファイル数の制限】

ルートディレクトリには、ファイルが 512個 までしか作成できません。
ファイル名が長いと、作成できる数が 512個 よりも少なくなるようです(?)。

ルートディレクトリより下の階層では、ファイル数の制限はありません。


【ドライブ名】

一般的にドライブ名といえば、"C:" や、"D:" などですが、
完全なドライブ名前は "\\.\C" や、"\\.\D" となっています。


【ハートマーク】

Windows NT 系では、ファイル名を Unicode で扱っているので、 ファイル名に S-JISには無い文字を付けることが出来ます。 例えば、ハートマーク なんかがそうです。

こんな感じ

簡単なやり方としては、Webサイトからコピペすればできます。

ハートマークのような文字(S-JISに変換できないUnicode)を含んだファイル名を付けると、扱えないソフトウェアが多いため、 注意!
< お〜瑠璃ね〜む ver4.0以降では、Unicode専用文字も扱えるようになりました >


戻る