2

Visual Studio セットアップ プロジェクトの一部としてランダムな名前を持つ既存のディレクトリにファイルを追加する方法を探しています。誰かがこのパズルを解決するのを手伝ってくれることを願っています。

起動条件を使用して、ディレクトリの検出されたパス プロパティを取得しようとしています。残念ながら、このメソッドは、ディレクトリ プロパティとして使用できないファイル名を含む完全なファイル パスを返します。


問題のディレクトリは、ランダムなインストール文字列の形式[AppDataFolder]Company\Product\aaaaaaaaaaaa\ をとります。aaaaaaaaaaaa

Launch Condition Setup 内で、ディレクトリ内に表示されるファイルを検索して、ディレクトリの存在を確認します。

検索対象マシン

(Name): File marker
Filename: sample.txt 
Folder: [AppDataFolder]Company\Product\
Property: DIRFILE

発射条件

(Name): File marker exists
Condition: DIRFILE

セットアップ プロジェクトで、挿入したいファイルを詳細とともに追加します。

Condition: DIRFILE
Folder: 'Installation folder'

次に、ファイル システムのセットアップで、ランダム ディレクトリの新しいフォルダー エントリを追加します。aaaaaaaaaaaa

(Name): Installation folder 
Condition: DIRFILE
DefaultLocation: [DIRFILE]\..\ *Incorrect*
Property [DIRLOCATION]

ご覧のとおり、インストーラーはマーカー ファイルの存在を検出しますが、ファイルを同じ場所に配置する代わりに[DIRFILE]、インストーラーを使用すると、誤ってファイルに挿入しようとします。

これは、ファイル パスが返されたためです。

[AppDataFolder]Company\Product\aaaaaaaaaaaa\sample.txt

代わりにディレクトリパスが必要です

[AppDataFolder]Company\Product\aaaaaaaaaaaa

したがって、ファイル名の文字列置換を実行してディレクトリ パスを抽出できれば、(ファイルのファイルの場所ではなく) 検索対象マシンからファイルが見つかったディレクトリを返すことができるかどうか疑問に思っていました。DIRFILEFile System Setup の DefaultLocation フィールド内のファイルの場所、またはおそらく別の方法が見つからない場合は?

4

1 に答える 1

0

私はまた、セットアッププロジェクト内で、これに対する簡単な解決策にも非常に興味があります。

私がそれを解決した方法は、ファイルを一時的な場所にインストールしてから、 AfterInstall イベントハンドラーの最終的な場所にコピーすることでした。非常にエレガントなソリューションではありません。ユーザーが選択したターゲットパスを気にしなくなったので、そのダイアログを削除しました。また、アンインストール時には特に注意が必要でした。

public override void OnAfterInstall(IDictionary savedState)
{
    base.OnAfterInstall(savedState);

    // Get original file folder
    string originDir = Context.Parameters["targetdir"];

    // Get new file folder based on the dir of sample.txt
    string newDir = Path.GetDirectoryName(Context.Parameters["dirfile"]);

    // Application executable file name 
    // (or loop for all files on the path instead)
    string filename = "ApplicationName.exe";

    // Move or copy the file
    File.Move(Path.Combine(originDir, filename), Path.Combine(newDir, filename)));
}
于 2013-12-10T13:39:58.350 に答える