LFNDOS: DOS LFN driver (c) 1998, 1999 Chris Jones 目次 - LFNDOS とは何か? - システム要求条件 - LFNDOS の使い方 - 変更点 - メモ - 連絡方法 - 技術情報 - 法的なお話 LFNDOS とは何か? ---------------- LFNDOS は DOS のプログラムで Windows95 の Long Filename (LFN) の API を使 えるようにします。Windows95 の元で、DOS のプログラムは Windows の提供する ファンクションコールを呼ぶことにより長いファイル名を使うことができます。 例えば、COMMAND.COM は Windows の DOS プロンプトとして使っているときには 長いファイル名が使えますが、MS-DOS モードで再起動すると使えなくなってしま います。EDIT.COM のようなその他のプログラムや、DJGPP で作成された全てのプ ログラムも可能であれば長いファイル名が使えます。 LFNDOS は DOS の元で長いファイル名を使えるサービスを提供し、これらのよう なプログラムで長いファイル名が使えるようにします。Windows95 と同じ形式で 名前がディスクに記録されていれば、両方のシステムで互いに長いファイル名を 見たり使ったりすることが可能です。 LFNDOS を使えば、Windows95 は必要なくなることがあります。 例えば、Windows95 を使っている友人からもらったディスクのファイル名を見る とき、ALONGF~1.DOC のような短い名前を使わなくて済みます。 システム要求条件 ---------------- 必要とするものは、MS-DOS 3.30 以降だけです。 LFNDOS はメモリ常駐型プログラムであり、常駐時に約60KBのコンベンショナ ルメモリを必要とします。 LFNDOS は現在、FAT-12 と FAT-16 のディスクで使えます。(これはフロッピー と2GB以下のハードディスクで標準的に使われているフォーマットです。) FAT-32 のドライブで使える可能性は不定です。作者は、600MBの FAT-32 の パーテーションでテストを行っていますが、巨大ドライブは注意深く扱うべきで す。多分完全に動作しますが、しかし作者はテストする機会に恵まれていません。 結果のフィードバックを求む。 また、LFNDOS は例えば、CD-ROM やネットワークドライブのような、ディスクに 対する直接アクセスが許可されていないドライブに対しては動作しません。これ らのドライブでボリューム情報取得ファンクションを使うと、LFN は使えないと いう答えが返ってきます。いくつかのプログラムには C: ドライブが LFN に対応 しているかだけをチェックし、他の全てのドライブはその結果と同じとみなすと いうように作ってあり、これは本当にその場合ではないとき、些細なバグを内包 します。ただ、DOS 7 の COMMAND.COM は問題なく動作します。 作者は CD-ROM をサポートするように努めていますが、多分次のリリースになる のではないかなぁ・・・。もしCDの長い名前と短い名前をマッチさせる方法を ご存知でしたら、ぜひ教えてください。 LFNDOS の使い方 --------------- LFNDOS を使うには、単にDOSのプロンプトで LFNDOS とタイプするだけです。 その後、常駐解除するためには、EXIT とタイプします。 LFNDOS をUMBに読みこむこともできますが、そのときにはUMBに45KB以 上の空きが必要です。そのときには、LH LFNDOS とタイプします。もし、 「Abnormal program termination」というメッセージが出たら、そのときには十 分なUMBがないので、代わりに LFNDOS とタイプしてください。 警告:たとえ LFNDOS がディスクを読みこむにあたって完全に安全であったとし ても(例えば、ファイル検索及び存在しているファイルのオープン)、ディスク にファイル名を書きこむときにはディスク直接アクセスを使うことを気に留めて おいてください。それゆえ、他のディスク直接アクセスプログラムのように、フ ァイルを作る前に必ずディスクのバックアップをしてください。 (ヒント:最初はフロッピーで試してみましょう) 変更点 ------ v1.06 での変更点: * Get Current Directory で長い名前を返すようにした。 * 短いファイル名を作るときに、'!' や '@' などの種類の文字を使うことを許 容した。今まではファイル名を前半までで切り捨てて ~1 をつける原因となっ ていた。(「Plus!」は「PLUS!」とします。「PLUS~1」にはなりません。) * 最初のピリオド以降を拡張子として短いファイル名を作るバグを除去した。 現在は最後のピリオドを拡張子として使う。(「e.t.c.exe」は「etc~1.exe」 とします。いままでは「e~1.tce」となっていました。) * 巨大ドライブで FAT32 を使ったときにゴミが表示されるバグを除去した。 * そのファイルを含んでいるディレクトリと同じ名前のファイルを削除しようと したときに全ディレクトリが削除されてしまうバグを除去した。 v1.05 での変更点: * 現在サポートしている複数ファイルサーチでは1回だけファイルを開くように し、「FindFirst used nested」エラーが出ないようにした。 * ファイルの日時構造体のバイトオーダーを正しくした。 * ファイル名が9.1文字だったときに起こる危険なバグを除去した。 (例:CHARACTER.H) v1.04c での変更点: * FAT32 のドライブで表示するファイルがないときに発生するバグを除去した。 v1.04 での変更点: * ワイルドカードを使ったファイル削除をサポートした。 * 拡張ワイルドカードを使った検索のバグを除去した。 (例:*AND* は現在正しく検索できます) v1.03 での変更点: * Make Directory のサポートを追加した。 * FAT32 のサポート方法を改良した。 (もう "directory-too-long" エラーは出ません) * ルートディレクトリにファイルを作れないバグを除去した。 * スラッシュ変換を追加したので、多くの DJGPP で作られたアプリが動くよう になった。 v1.02a での変更点: * FAT32 のサポートを追加した。 * 拡張ディレクトリエントリ作成時に発生するバグを除去した。 メモ ---- サポートしているAPIファンクション 技術的な興味がある方のために、LFNDOS の提供するファンクションを下記に記し ます。(カッコ内は制限事項です) INT 21/AX=7139 ディレクトリの作成 INT 21/AX=713A ディレクトリの削除 INT 21/AX=713B カレント・ディレクトリの変更 INT 21/AX=7141 ファイルの削除 INT 21/AX=7143 ファイル属性の取得/設定 (一部機能のみ) INT 21/AX=7147 カレントディレクトリの取得 INT 21/AX=714E 最初に一致するファイル名の検索 INT 21/AX=714F 次に一致するファイル名の検索 INT 21/AX=7156 ファイル名の変更 (同一ディレクトリ内のみ) INT 21/AX=7160 フルパス名 INT 21/AX=716C 拡張オープン/クリエート INT 21/AX=71A0 ボリューム情報の取得 INT 21/AX=71A1 ファイル名の検索の終了 INT 21/AX=71A7 日付/時刻の形式の変換 (一部機能のみ) INT 21/AX=71A8 エイリアス名の作成 (一部機能のみ) 他には、同時に検索(AX=714E)できるのは一度に10個まで、という制限があり ます。もし、プログラムが一度に可能な量以上に同時検索を行おうとすると、 LFNDOS はエラーメッセージを表示します。 以下のファンクションは現在まだインプリメントされていません・・・呼び出し た場合、エラーが発生します。 INT 21/AX=710D ドライブのリセット INT 21/AX=71A6 ファイル情報の取得 INT 21/AX=71A9 サーバ用拡張オープン/クリエート WINDOWS LFNDOS は Windows3.x が読みこまれる前に読みこんでおくことができるため、そ うしておけば LFN のファンクションコールをサポートしている各種のプログラム に対してもその機能を提供できます。 Windows95/98 を読みこむ前には、必ず LFNDOS を取り除いておかなければなりま せん。Windows を終了した後なら、もう一度読みこみなおすことができます。 情報:LFNDOS の動作 LFNDOS の動作は、長いファイル名をその短いファイル名に変換することと、その 短い名前を DOS に渡すことが全てです。それで、例えば「open file」コマンド のとき、LFNDOS は与えられた長い名前を検索し、短い名前のエイリアスを見つけ るとともに、そのエイリアスを使って DOS のファイルオープンファンクションを 呼び出します。このように、LFNDOS 自身がその機能を実現しているのではなく、 常にリクエストを DOS に渡してしまうので、LFNDOS は完全に DOS と互換性があ ります。 ほかの例をあげると、ディレクトリ削除の場合、LFNDOS はハードディスクから長 い名前のエントリを単純に削除するだけであり、そしてそのとき、DOS に対して、 そのディレクトリの短い名前に相当するものを削除対象として通知します。その ため、LFNDOS は FAT にあるマークされたクラスタを都合よく処理することはあ りませんので、シンプルかつ高信頼性です。(常に FAT をいじくりまわすことは お好きですか?) バグ/問題点 現在、LFNDOS はエラーチェックが十分できていないので、時々データを失ってし まうことがあります。もし LFN の名前の変更を使って無効な名前に変更しようと した場合、例えば "ren myfile.bat \noexist\notallowed.txt" とすると、古い ほうのエントリは削除されてしまいますが、新しいほうのエントリはできてきま せん。この場合、SCANDISK を走らせると、「破損クラスタ」として表示されます。 もし、これらをファイルとして保存すれば、データを回復することができます。 (でも、FILE0000.CHK を新しい名前にしないとだめだぞ!) もし、DOS 用の新しい PKZIP/PKUNZIP 2.50 を持っていれば、PKUNZIP が -d オ プションを使ったときに「Warning! Cannot create file」というメッセージを表 示します。この問題は、WinZip のような他のアーカイバで作られた zip ファイ ルの時だけ起こります。PKZIP で作られた zip ファイルは、LFNDOS の上で動く PKUNZIP -d で気持ちよく解凍されます。(これは、他のアーカイバがサブディレ クトリを保存したことによります。) 解決策は、必要となるサブディレクトリをあらかじめ手動で作っておくことで、 そのあと PKUNZIP -d を行ってください。 MS-DOS 7 の MOVE コマンドと DELTREE コマンドは LFNDOS の元では正しく機能 しません。これらのコマンドは、データの損失を招く恐れがあるので、使わない で下さい。 XCOPY コマンドは LFNDOS の元では長いファイル名を認識しません。もし LFN を 使いたければ、代わりに普通の COPY を使ってください。 極端に長いファイル名も作れません。半角で約90文字以上のファイル名を使お うとすると、LFNDOS がクラッシュすることがあります。これはバグでして、対応 しているところですが、現在のところ、取り除くことができていません。 (警告:長すぎる文字列を使うと、ディスクまでクラッシュするかもしれません) もし、新しいファイルを作るときに、LFNDOS がそれに新しいセクタを割り当てら れなければ、ディレクトリがオーバーフローを起こすことがあります。このとき、 「cannot create directory entry」というメッセージが表示されます。ファイル 作成時にこうなる場合の解決策は、生DOSにおいてこのディレクトリに A.TXT、 B.TXT、C.TXT、D.TXT といったようなファイルをいくつか作り、それからすぐに それらのファイルを削除することで、こうするとDOSがあらかじめ新しいセク タを割り当ててくれます。 世界各国の利用者に留意していただきたいことは、LFNDOS はアクセント記号つき の文字を使うような言語で使われる、アスキーコードの値が128以上の文字を 正しく表示できないということです。これは、Windows がDOSとは異なった文 字コードセットを使うためでして、Windows においては長い名前のエントリはユ ニコードで格納されています。この点を指摘してくれた Artur Yelchishchev に 感謝します。 LFNDOS は現在キャッシュ機能を含んでいません。これは、生DOSに比べて著し く遅いということを意味しています。私はキャッシュを実装する方法を調査して いるところです。 コメント -------- LFNDOS はフリーウェアであり、オリジナルの変更されていないアーカイブであれ ば自由に配布できます。 ご意見・ご提案は、dosuser@bigfoot.com までお送り下さい。 WEBサイト: http://members.xoom.com/dosuser 技術情報と背景 -------------- 生DOSのファイルエントリは32バイト単位でディスクに格納されています。 これは以下のような構造になっています。 ファイル名 [11 bytes] ファイル属性 [1 byte] システム予約 [2 bytes] ファイル作成時刻 [1 integer] - Windows 9x のみ ファイル作成日付 [1 integer] - 同上 最終アクセス日付 [1 integer] - DOS 7.0 以降のみ 開始クラスタ番号上位 [1 integer] - クラスタ番号上位ワードがあるのは FAT-32 のみ 最終書き込み時刻 [1 integer] 最終書き込み日付 [1 integer] 開始クラスタ番号下位 [1 integer] ファイルサイズ [1 long] さまざまな長いファイル名を使えるシステムが試されてきました。もっとも単純 なものは、1つのファイルに全てのファイル名を格納するという形態のもので、 短いファイル名と長いファイル名のペアのリストである、DOS4 の DESCRIPT.ION のようなものです。この場合の問題は、ファイルの open、read、move のための 記述の使用が許可されないということで、これらはちょうど可視拡張です。 ここでマイクロソフトは、ファイル名の格納にディレクトリエントリを使うとい うアイディアを提示しました。マイクロソフトの LFN はファイル実体のディレク トリエントリの続きのディレクトリエントリとして格納されています。これらは、 以下のようなフォーマットになっています: インデックス番号 [1 byte] 長いファイル名 part.1 [5 integers] ファイル属性 [1 byte] 予約領域 [1 byte] チェックサム [1 byte] 長いファイル名 part.2 [6 integers] 開始クラスタ番号 [1 integer] 長いファイル名 part.3 [2 integers] 注意することは、長いファイル名は UNICODE で記録されていることです。1文字 毎に2バイトを必要とします。属性と開始クラスタ番号は通常のDOSでアクセ スした際に誤動作しないようにするために存在しています。(属性は、リードオ ンリー・隠しファイル・システム・ボリュームラベルか、さもなければ不可能な 組み合わせです) 長い名前から算出されたチェックサムは、例えば、古いバージョンのDOSを使 ってファイルをコピーしたようなとき、短い名前から切り離されてしまいます。 ディレクトリエントリとして名前を格納するにあたっての興味深い点は、FAT におけるルートディレクトリのエントリの数に限界があるということで、通常は 500前後です。これが意味していることは、ルートディレクトリにとてつもな く長い名前のファイルを3個か4個作るとルート領域がいっぱいになってしまう ということで、もしルートディレクトリにさらに新しいファイルを作ろうとする と「cannot create directory entry」というエラーになります。(各 LFN エン トリは、13文字しか保持できません。つまり、200文字のファイル名は、な んと16エントリも消費するのです!) 法的なお話 ---------- このソフトウェアは完全に無保証であり、業務上の、または特定目的適合性に関 する暗黙の保証もありません。このソフトウェアを使ったことにより、もしくは 間違った使い方によりあなたのコンピュータで何かが起ころうとも、作者はいか なる問合せに対しても対応する義務を負いません。