2012-04-10 21 views
1

私はインストーラを持っていて、いくつかのディレクトリにいくつかのファイルをコピーします。各ファイルは、単一のコンポーネントとして宣言され、パスがあります。ディレクトリが存在しない場合は、インストーラがファイルを作成し、そこにファイルを配置します。Wix - ディレクトリ全体を上書きしないようにする方法は?

私がしたいこと:ディレクトリがすでに存在する場合、インストーラはファイルをコピーしないでください(ファイルが存在しない場合でも、既存のディレクトリにコピーしないでください)。

しかし、ディレクトリに「上書きしないでください」を設定することは不可能です。新しいファイルを既存のディレクトリにコピーしないようにするにはどうすればよいですか?ここで使用できる条件(「ディレクトリが存在する」のようなもの)はありますか?

答えて

1

ここで使用できる条件(「ディレクトリが存在します」など)はありますか?

はい、あなたはこのように条件要素を使用することができます。

<Directory Id="FooFolder" Name="Foo"> 
    <Component Id="SomeId"> 
     <File Source="..." /> 
     <Condition>Not FOO_FOLDER_ALREADY_EXISTS</Condition> 
    </Component> 
</Directory> 

あなたが条件として使用できるものの種類は、WindowsインストーラのConditional Statement Syntaxドキュメントで説明されています。この場合

、私はあなたがこのような DirectorySearchFOO_FOLDER_ALREADY_EXISTSプロパティを設定することができると信じて:

<Property Id="FOO_FOLDER_ALREADY_EXISTS"> 
    <DirectorySearch Id="FooFolderSearch" Path="[FooFolder]" /> 
</Property> 

編集:ので、明らかに上記のディレクトリ検索が機能しません。 [FooFolder]プロパティは、CostFinalizeアクション中にのみ解決されます(documentation参照)。しかし、ディレクトリ検索はすでにAppSearchの処理中に行われます。

これを回避する方法がわかりません。おそらく、CostFinalizeの後にFOO_FOLDER_ALREADY_EXISTSプロパティを設定し、Windowsインストーラーのディレクトリ検索ではなくカスタムアクションで設定することになります。

+0

どのように相対パス、目的地ディレクトリ内のパスを設定しますか?私は、ID番号のMYSQLを持っている: <コンポーネントID = "COPYING" DiskId = "1" のGuid = "B045BC99-F36E-49A7-8CD6-24C09EA27ADC"> SETUP_MODE = "FirstComputer" <ファイルID = "COPYING" NAME = "COPYING" ソース= "InstallerFiles \ BIT Rejestry \のMySQL \のCOPYING" /> しかし、これは今働くん: <プロパティID = "MYSQLFOLDERALREADYEXISTS"> user1209216

0

コストの確定前にプロパティが設定されているタイミングの問題を回避する方法については、レジストリにプロパティを書き込むこともできます。

これは、プロパティが設定されているタイミングに関する最も一般的な回避策であり、インストーラがアンインストールなどのプロパティを追跡できるようになると思います。

ここにはa good article by Rob Menschingが用意されています。

関連する問題