作为Visual Studio安装项目的一部分,我正在寻找一种将文件添加到具有随机名称的现有目录的方法,我希望有人能帮助我解决这个难题。
我一直试图使用启动条件获取目录的已发现路径属性;不幸的是,此方法返回完整的文件路径,包括文件名,该文件名不能用作目录属性。
有问题的目录的形式为[AppDataFolder]CompanyProductaaaaaaaaaaaa
其中CCD_ 2是随机安装字符串。
在启动条件设置中,我通过搜索将出现在其中的文件来检查目录的存在
搜索目标机器
(Name): File marker
Filename: sample.txt
Folder: [AppDataFolder]CompanyProduct
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]CompanyProductaaaaaaaaaaaasample.txt
我需要目录路径
[AppDataFolder]CompanyProductaaaaaaaaaaaa
因此,我想知道是否可以从搜索目标计算机返回文件所在的目录(而不是文件的文件位置),是否可以通过在文件系统设置程序的DefaultLocation字段中的文件位置DIRFILE
上执行字符串替换文件名来提取目录路径,或者是否还有我缺少的其他方法?
我也对安装项目中的一个简单解决方案非常感兴趣。
我解决这个问题的方法是将文件安装到一个临时位置,然后将它们复制到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)));
}