トップ回答者
CABファイル作成時の同一ファイル名の取り扱いについて

質問
-
【環境】Visual Studio 2005
お世話になります。以下のように違うフォルダにある同じ名前のファイルを、
それぞれ別の場所にインストールするように設定してCABファイルを作成しました。D:\テスト\ja\hellow.wav → \wave\ja\hellow.wav
D:\テスト\en\hellow.wav → \wave\en\hellow.wavしかし、このCABファイルでPDAにインストールを行ったところ、
2つのファイルが同じものになってしまいました。
(今回の場合はどちらもD:\テスト\ja\hellow.wavのものになってました。)
そこで、どの段階で2つのファイルが同じものになったのか調べるために
CABファイルを解凍して中身をみてみました。そうすると、CABファイル内ですでに2つのファイルが同じものになっていました。
ということは、CABファイル作成時点でソースファイルが正しく認識されていないというなので、
CABプロジェクトで両方のファイルのSourcePathを確認しましたが、
ちゃんとそれぞれのファイルを指定していました。となると、一体何が原因なのでしょう?
この問題の原因、そして解決策をご存知の方がいたら教えていただけないでしょうか。
よろしくお願いいたします。ちなみに、ソースファイル名を別々のものにしてCABファイルを作成したら、
正常にインストールされました。
これも1つの解決策なのですが、
できればファイル名を変更しないで解決できる方法が知りたいです。
回答
-
>[SourceDisksFiles]
>"hellow.wav"=1
>"hellow.wav"=2多分、原因はここでしょうね。.inf ファイルは .ini ファイルと同じように
処理されるでしょうから、同じセクション内に同じ項目名が現れている
為にうまく動作しないのでしょう。
■対策其の壱元のファイル名を変更し、インストール時に元の名前に戻す。
>[Files.Common1]
>"hellow.wav","hellow.wav",,0
>
>[Files.Common2]
>"hellow.wav","hellow.wav",,0インストール時に↑ここの情報を元にファイルがコピーされるハズですので
ここを弄ればコピーとともにファイル名が変更される(元に戻せる)ハズです。# 最初のファイル名がコピー先のファイル名で、二つ目のファイル名が
# コピー元のファイル名になっています。
>また、もしこれを修正した場合、VSを使ってCABファイルを作成するにはどうすればいいのでしょうか。ごめん、VS2005とか使ったことがないんでそのへんは知らね。
■対策其の弐自分でCABファイルを作成する。
...CABファイルの作成は cabarc コマンドでも使えば簡単にできるのですが、
多分、CABファイルが展開される際にディレクトリ情報を無視してフラットに
展開されるなどしてうまく機能しない気がします。
# う~ん、結局の所、制限事項ってことですかねぇ。 -
こんにちは。
見落としていました・・・。
たぶんこれです。
Smart Device CAB Project includes wrong localized resources
次回のWindows Mobile SDKアップデートで対応、とか見かけた気がします。
対策は道化師さんのレス通り、INFを書き換えてやるといいかと。
問題のファイルのリネーム、CabWiz、リネームの戻しをバッチファイルにしておけば、見かけ上期待通りに動作するCabファイルの作成を自動化できます。
すべての返信
-
>そうすると、CABファイル内ですでに2つのファイルが同じものになっていました。
どういうふうにそのCABファイルを作ってんのか知らないけど、
ひとつのCABファイル内に同名のファイルを複数同居させる(=ディレクトリ情報を保持させる)方法なら
手前味噌でなんだけど、↓このへんでも参考にしてくだされ。 -
道化師さん、アドバイスありがとうございます。
私はVS2005でCABを作成しています。スマートデバイスCABプロジェクトを追加し、
そこにインストールするものを入れていって、ビルドしてます。そうすると、VSが自動的に以下のような設定ファイルを作って、
CABファイルを作成してくれます。*** infファイル内容 **********************
[Version]
Signature="$Windows NT$"
Provider="hogehoge"
CESignature="$Windows CE$"[CEStrings]
AppName="CabTest"
InstallDir=%CE1%\%AppName%[Strings]
Manufacturer="hogehoge"[CEDevice]
VersionMin=4.0
VersionMax=6.99
BuildMax=0xE0000000[DefaultInstall]
CEShortcuts=Shortcuts
AddReg=RegKeys
CopyFiles=Files.Common1,Files.Common2[SourceDisksNames]
1=,"Common1",,"D:\テスト\en\"
2=,"Common2",,"D:\テスト\ja\"[SourceDisksFiles]
"hellow.wav"=1
"hellow.wav"=2[DestinationDirs]
Shortcuts=0,%CE2%\Start Menu
Files.Common1=0,"%CE1%\wave\en"
Files.Common2=0,"%CE1%\wave\ja"[Files.Common1]
"hellow.wav","hellow.wav",,0[Files.Common2]
"hellow.wav","hellow.wav",,0
*******************************************これを見ると、ソースファイルはちゃんと別のものが指定されているように見えるのですが、
できたCABファイルの中身は2つのファイルが同じものになってしまいます。このinfファイルでおかしなところがあるのでしょうか。
また、もしこれを修正した場合、VSを使ってCABファイルを作成するにはどうすればいいのでしょうか。
それとも、それは無理で自分でCABファイルを作成しなければならないのでしょか。よろしくお願いいたします。
-
>[SourceDisksFiles]
>"hellow.wav"=1
>"hellow.wav"=2多分、原因はここでしょうね。.inf ファイルは .ini ファイルと同じように
処理されるでしょうから、同じセクション内に同じ項目名が現れている
為にうまく動作しないのでしょう。
■対策其の壱元のファイル名を変更し、インストール時に元の名前に戻す。
>[Files.Common1]
>"hellow.wav","hellow.wav",,0
>
>[Files.Common2]
>"hellow.wav","hellow.wav",,0インストール時に↑ここの情報を元にファイルがコピーされるハズですので
ここを弄ればコピーとともにファイル名が変更される(元に戻せる)ハズです。# 最初のファイル名がコピー先のファイル名で、二つ目のファイル名が
# コピー元のファイル名になっています。
>また、もしこれを修正した場合、VSを使ってCABファイルを作成するにはどうすればいいのでしょうか。ごめん、VS2005とか使ったことがないんでそのへんは知らね。
■対策其の弐自分でCABファイルを作成する。
...CABファイルの作成は cabarc コマンドでも使えば簡単にできるのですが、
多分、CABファイルが展開される際にディレクトリ情報を無視してフラットに
展開されるなどしてうまく機能しない気がします。
# う~ん、結局の所、制限事項ってことですかねぇ。 -
道化師さん、詳しい解説ありがとうございます。
>[SourceDisksFiles]
>"hellow.wav"=1
>"hellow.wav"=2なるほど。これが原因だったのですね。
上から処理されて、2の方(SourceDisksNamesで2に指定されているディレクトリのもの)が
hellow.wavとして認識されてしまってるのですね。
たしかにCABファイルの中身はどっちもjaのもの(SourceDisksNamesで2になってる)になってました。こうなると、VS2005を使った場合はもとのファイル名が同じではうまく作れないみたいですね。
今は対策1の方で対応しています。
もとのファイル名を別にすればVS2005を使ってちゃんとしたCABファイルが作れます。でも、ファイル名を同じにするためにディレクトリ分けてるので、
なんだかなぁという感じです。 -
こんにちは。
見落としていました・・・。
たぶんこれです。
Smart Device CAB Project includes wrong localized resources
次回のWindows Mobile SDKアップデートで対応、とか見かけた気がします。
対策は道化師さんのレス通り、INFを書き換えてやるといいかと。
問題のファイルのリネーム、CabWiz、リネームの戻しをバッチファイルにしておけば、見かけ上期待通りに動作するCabファイルの作成を自動化できます。