ファイルのリネーム


■ファイル名が暗号みたいになっている理由

前章でも出てきましたが、内包型MsiファイルからCabファイルを取り出して解凍すると、英数字が無意味に羅列したファイルばかりが出てくることがあります。

英数字の羅列

これは、Msiを作成するソフトがこのようにCabファイルを作成するからに他なりません。たとえば大定番の開発用ソフト【Microsoft Visual Studio】にMsiを作る機能がありますが、これでMsiを作成すると、上のように暗号化されます。もちろん、【Windows インストーラ】で普通にインストールする時には、インストール途中の段階で元の正しいファイル名に戻されて所定の位置に展開されるので、何の問題もないのです。

ではなぜ、わざわざこんな面倒な改名をするのでしょう? 「どうせ元に戻すのだったら、始めからそのままの名前にしておけば良いじゃないか!」と考えるのが普通です。Cabファイルの中のファイルを一時的に改名する理由は色々あるのでしょうし、私も全然知識は無いないのですが、理由のうちの1つを挙げることはできます。下図を見てください。(少し極端な例です)

インストール時の展開図

このインストーラでは、Msiファイルに内包される1つのCabファイルの中に、インストール時に展開される全てのファイルが圧縮されて含まれているとします。インストールをすると、sample.exe というファイルが3つの別々の場所に配置されます。(インストールフォルダ&システムフォルダ&APPDATAフォルダ) 名前こそ同じですが、これらはすべてバイナリ的には異なる別々のファイルです。またインストール先のフォルダの下に2つのサブフォルダを作り、それぞれにsample.ini という同名のファイルを配置しますが、これもまたそれぞれ異なるファイルになっています。

この例だと、Msi作製時に、元々のCabファイルの中に、sample.exeとかsample.iniと言う名前のままでそのファイルを含めることはできません。名前がダブって干渉しあってしまうからです。回避策としては、sample1.exe/sample2.exeなどどリネームしておいてCabファイルに収めておき、インストール時に別々の場所に配置する段階で元の本来の名前に戻してやる方法を採ることになります。上図で言うと、元々異なる名前だったファイルを、紫色の矢印の段階でsample.exeにリネームし、緑色の矢印の段階でsample.iniにリネームするという方法です。場所(パス)さえ違えば同名ファイルがいくつあっても構わないわけですから。(Cabファイルを複数にする対策法ももちろんありますが、今は単一Cabファイルの場合を想定してください。)

sample1.exeなどという単純なリネームではなく、あたかも暗号化したようなファイル名を利用すると、最初の例のようになります。このヘンテコな名前はプログラマが考えて付けた訳ではなく、Msi作成ソフトが勝手に作り出したもので、人間から見ると訳がわかりませんが、CPUからすると、どうってことない別名ということになるのでしょう。

■改変した名前と本来の名前の『対照表』

ファイル名を一時的に改変してCabファイルに収めなければならない場合があるということは、理解していただけたと思います。

そこで気になるのは、「改変した名前を本来の名前に戻すための対照表のような情報は、どこにあるんだ?」ということでしょう。これもMsiファイルの中のデータベースに記録されています。FileというTableのFile欄が改名された名前で、FileName欄が本来の名前です。下の図を見てください。

Fileテーブル

【Windows インストーラ】は、インストール時に、この情報を利用して、ファイル名を元に戻します。

【MSI2FILE】も、この情報によってリネームします。【Windows インストーラ】と違うのは、【Windows インストーラ】の場合は上の展開図のように、あちこちのフォルダに分散して、リネーム後のファイルを配置するわけですが、【MSI2FILE】はインストーラではなく抽出ソフトですから、1つのCabファイルから抽出したファイルは、まとめて1つのフォルダへ吐き出します。そうすると、先ほどの例ならば3つのsample.exeが出てきて、名前がバッティングしてしまいます。そこで基礎編で書いたように、順にsample.exe/[2]sample.exe/[3]sample.exeとする方法で、この問題を回避しています。

したがって、抽出物のフォルダの中に、[*]…というファイルを見つけたら、「これは本当は…というファイル名なんだな。」と理解しておいてください

■リネーム情報が欠如しているMsiファイル

Fileテーブルの情報が欠如していたり不完全だった場合、ファイルはリネームされません。この場合は、【Windows インストーラ】でも【MSI2FILE】でもリネームはできないわけです。対照表が存在しないわけですから。

逆に言えば、【Windows インストーラ】がリネームしないでインストールしているファイルは、それが正式名称だともいえるわけで、【MSI2FILE】においてもリネームしないでそのままにしておくというのが正しい挙動であると言えます。

msi2fileの作業工程

上図は【MSI2FILE】の作業工程です。リネーム情報が欠如しているMsiファイルの場合には、第三段階は行わずに、第二段階までで終了するようになっています。この際に、一応ユーザーに情報を伝えるため、

リネーム情報欠如メッセージ

というメッセージを出しますが、Msiファイルが正常なものである限り、このメッセージが出ても問題がないと考えられます。

【MSI2FILE】は、第二段階終了時点で、***リネーム情報欠如抽出ファイル群No.#の中に、すべての抽出ファイルを吐き出しており、第三段階において、その中のリネーム情報のあるファイル(すなわち対照表に名前が載っているファイル)のみリネームして、***抽出ファイル群No.#に移しています。

したがって、対照表に一部のファイル名だけが載っており、名前が載っていないファイルも存在する場合には、下図のように1つのCabファイルを親とする2つのフォルダができることになります。

2つのフォルダ

この場合は、対照表自体は存在しているので、上の報告メッセージは出ずに、

正常終了メッセージ

が表示されます。このケースでもMsiファイルが正常なものである限り、何も問題はないでしょう。

通常の場合は、全てのファイルが対照表に載っています。この場合、第二段階で作られた***リネーム情報欠如抽出ファイル群No.#フォルダの中のファイルは全部***抽出ファイル群No.#へ移動してしまいます。中身が空になった場合には、【MSI2FILE】は***リネーム情報欠如抽出ファイル群No.#フォルダを消去します。結果として***抽出ファイル群No.#フォルダのみが残ることになります。