SFN: MS-DOS プログラムを LFN 対応させるラッパー 豊田英司 1997年8月12日 1. 概要 Windows95で導入された長いファイル名 (LFN) は従来のMS-DOSプログラムから は操作できません。まっとうな解決は同様な機能を持ち長いファイル名を操作できる32 ビットコンソールモードプログラムを開発することですが、ソースコードが公開されてい ないプログラムや16ビットに依存したプログラムの場合、必ずしもそれは容易でありま せん。 SFN はこのようなプログラムを救済するために作られました。SFNという名前 は Short File Name から来ています。 2. 起動書式 SFN [-options] command [arguments…] 3. 説明 SFN はCOMMAND.COMと同じようにPATH環境変数を用いて command に対応 するプログラムを探索し、これを起動します。プログラムファイルの拡張子の優先順位 は .EXE, .COM, .BAT, .CMDです。このとき arguments の中のファイル名になってい るものを Short File Name (MS-DOS名) に変換してcommandに渡します。 スペースを含む引数をSFNに与えるには引用符 (") で保護する必要があります。この 引用符はSFN の起動時にBorland C++ のスタートアップコードによって解釈・除去さ れるので SFN は引用符の有無を感知しません。またアポストロフィ (') には同様の意 味はありません。引用符を含む文字列を渡したい場合は \" のように記述します。 SFNはデフォルトではcommandもBorland C++ で作られたプログラムと同様に引 用符を解釈すると仮定しています。commandに渡される文字列がスペース・タブ・引用 符を含んでいる場合、SFN は前後に引用符をつけ、引用符は \" のように変換します。 4. オプション SFNに対するオプションはcommandの前にのみ用いることができます。オプション は負号 (-) または斜線 (/) ではじまる文字列で、-ae または /an のように連結して用 いることができます。負号または斜線ではじまる名前の command を実行するときには オプションの最後に -- または // を指定することでコマンド名がSFNに対するオプシ ョンとみなされないようにすることができます。 -? 引数なしでSFNを起動したときと同様、書式を表示し終了します。 -a (apostrophe) commandに渡される文字列が引用符を含んでいる場合は前後に引 用符のかわりにアポストロフィをつけるようになります。これはsed, awk, perlのように アポストロフィを使って引数の保護をするプログラムを起動する場合に有用です。 -e (exit status) コマンドの終了ステータスを表示。-nを用いると無効になります。 -n (no execution) コマンドを実行せず、コマンドと引数を表示して終了します。 -o (no quote) どんな文字が入っていようと引数の保護を行いません。これは引用 符やアポストロフィの解釈を行わないプログラム(例: command.com /c echo)を起動する ときに有用です。 -t (touch) arguments のそれぞれの文字列がファイル名でない場合、いったんそ の名前のファイルを作ってから短い名前に変換します。これはエディタのようなプログラ ムで「SFN vi index.html」のような操作ができるようになるという点で有用ですが、現 在のバージョンではcommand に対するオプションが認識されずにファイルにされてし まうので注意して使ってください。 -x (exchange) SFNが引数の前後に引用符 ( -a指定時はアポストロフィ) を付加 する際に、引数の中の引用符をアポストロフィに、アポストロフィを引用符に入れ替えま す。これは \ でエスケープするのが不便なときに有用かもしれません。 5. 終了コード コマンドの起動が成功すればそのコマンドの終了コードを返します。そうでないときは 以下の終了コードを返します。 240 コマンド書式が間違っているか、-? オプションでヘルプが表示された 241 メモリが足りなくなった 242 存在しないワイルドカード (現在のバージョンでは発生しない) 249 バグまたはその他のエラーにより中断せざるを得なくなった 6. 制約・バグ どんな意図で記述したのであっても、ファイル名とみなされた文字列はすべて短い名前 に変換されます。現在のバージョンでは command に対するオプションを認識していま せんから、オプションに相当するファイル名を持つファイル (-f や /v など) が存在す ると思わぬ結果を引き起こすこともありえます。 現在のバージョンでは FILENAME が存在しても -oFILENAMEのような文字列は変換され ません。 現在のバージョンではワイルドカードをサポートしていません。 変換結果の引数リストが引数の長さの限界を超えてしまう場合の対処はしていません。 7. サンプル操作 SFN -t vi index.html index.html というファイルを作る SFN command /c echo index.html そのMS-DOS名を調べる SFN -a jgawk "{print $0 \"$\"}" index.html SFN -xa jgawk "{print $0 '$'}" index.html 行末に $ をつけて表示してみる 8. 作者 豊田英司 toyoda@ms.u-tokyo.ac.jp 9. 著作権など 本プログラムの著作権は豊田英司に帰属します。同梱の実行ファイルは Borland International の Borland C++ 5.01J によって作られたものです。 本プログラムは無償で保持・利用できます。ソースコードの再利用は (できるような質 かという問題はありますが) 自由にしてかまいません。本プログラムによる直接・間接の 損害に関しては著作権者はその責任を負いません。 10. 履歴 1997/05/? PC/AT 版 jvim で「vi index.html」ができないのに腹を立ててほぼ3日 で作った。当初は LFN という名前であった。 1997/06/07 最初のドキュメントを書く。知り合いに配布。 1997/08/12 UNIX Like tools 4.00 のマニュアルに LFN(5) ができたので名称を変更。 マニュアルを読みやすくした (つもり)。オプション -x のバグフィックス。