ロングファイル名
読み:ロングファイルめい
外語:LFN: Long File Name

 MS-DOSで長く使用されてきた8+3文字の名前より長いファイル名のこと。または、それら長い名前が使用できる環境や仕様のこと。
目次

概要
 UNIXなどでは古くから長いファイル名が使えたが、MS-DOSや初期のMicrosoft Windowsでは使えなかった。
 これは、オペレーティングシステム(OS)の制限というだけではなく、MS-DOSが採用したFATというファイルシステムの制限も加わっていたためである。別のファイルシステムに変えることは現実に極めて難しいことだったため、仕方なく8+3文字の名前で我慢していたのであった。
 しかしこれも、OS側の改良としてWindows 95からはVFATと呼ばれる仮想レイヤーが用意され、またファイルシステム側の改良としてFATでも強引な拡張により長いファイル名を格納する手法を確立したことにより、以降は長いファイル名も利用可能となった。これを「ロングファイル名」という。
 以降はこの方法についての技術的なことを述べる。

特徴

互換性確保
 敢えてFATという従来通りのファイルシステムを使う以上、従来との互換性確保が求められる。
 そこでこのメカニズムでは、長いファイル名と同時に、従来どおりの8.3に短縮したエイリアス名(別名)が作成される。なお、ファイル名が8.3文字以内であり名前の全てが英大文字、つまりFATと互換性のあるファイル名の場合は、エイリアス名は作成されない。
 一方、長いファイル名はUnicode(UTF-16)で保存される。長いファイル名では、大文字と小文字はそのままで保存されるが、文字の大小のゆれは同一ファイル名と認識されるため、たとえ文字の大小が違っていても、同名であれば同一フォルダー内に共存させることはできない。また検索などでも大文字と小文字は区別されない。この仕様は従来のソフトウェアとの互換性のための配慮である。
 つまり、一つのファイルは最大で二つのファイル名を持つことになる。

拡張子とエイリアス
 ファイル名に、ピリオドを複数入れることが出来る。そして、最後のピリオドの後が拡張子となる。
 拡張子は3文字より長くても良いが、エイリアスには頭の3文字だけが使われる。
 なお、ファイル名の先頭がピリオドで、他にピリオドがない場合には拡張子なしと判断される(但しExplorerを使用した場合には、このようなファイル名はエラーとして弾かれ作成できない)。
 また、ファイル名の末尾のピリオドは削除される(file....などはfileとなる)。

エイリアス名
 エイリアス名は、長いファイル名の最初の6文字に数値テール(~1)を付けてエイリアス名とする。
 既に重複するエイリアス名がある場合には、数値テールを1ずつ加算して重複しない名前を作る。
 ~9を超えてもまだ重複するファイル名がある場合には~10のようになり、長いファイル名の最初の5文字に数値テール(~10)という形式になる。
 以降、重複するエイリアス名がなくなるまで、これがくり返される。
 エイリアス名は、現在のコードページのOEM文字セットで、大文字に変換されて保存される(MS-DOS形式)。つまり日本語環境ならシフトJISが使われる。

内部技術

表現方法
 FATである以上、ディレクトリエントリは一つにつき32バイトである。これはてこでも動かない。
 そこで、従来と同様の形式でディレクトリエントリを作ることとし、ここにはエイリアス名を書くこととする。これにて互換性は確保できる。
 そしてこのディレクトリエントリ(DE)に先立つように、逆順に拡張領域を並べることとした。この拡張領域をロングネームディレクトリエントリ(LNDE)と呼ぶ。
 つまり、ディレクトリエントリは次のように並ぶ(とても長い場合)。
 拡張領域は、ファイル属性をR+H+S+Vとすることで表現する。
 ファイル属性は2ビット予備があるのでそれを用いても良かったのだが、ロングファイル名未対応の旧式MS-DOSでは何も無いかのように扱わせるため、このような強引な拡張方法を取ることとなった。

ディレクトリエントリ
 VFATで拡張された専用のエントリである。従来のFATエントリとは異なる機構で扱われる。
 エントリはFATなので一つにつき32バイトであり、次の順に格納される。
 この構造は、FATとの互換性に配慮されており、ファイル属性、先頭クラスターは位置が保存されている。
 一つのエントリに、Unicode(UTF-16)文字を13文字格納できる。ロングファイル名はNUL末端であり、つまりUTF-16で0x0000が必ず最後に付けられる。

仕様
 VFATにおける仕様は、次の通りである。

再検索