我需要安装程序来删除旧的安装目录(如果存在的话),就在安装程序开始复制新文件。 此文件夹包含了一些文件和程序的使用过程中产生的子文件夹,它们不包括在安装程序。 正因为如此,我已经创建自定义操作来做到这一点。
因此,一些代码。 首先,自定义操作代码(没有什么特别的存在):
[CustomAction]
public static ActionResult RemoveOldDatabase(Session session)
{
bool removeDatabase = session.CustomActionData["RemoveDatabase"] == "true";
string installDir = session.CustomActionData["InstallDir"];
if (removeDatabase)
{
try
{
Directory.Delete(installDir, true);
}
catch (Exception ex)
{
session.Log(ex.StackTrace);
}
}
return ActionResult.Success;
}
和威克斯代码(它定义自定义操作调用):
<CustomAction Id="actionCheckServerName" BinaryKey="actionBinary" DllEntry="CheckServerName" Execute="immediate" Return="check" />
<CustomAction Id="actionInstall" BinaryKey="actionBinary" DllEntry="Install" Execute="deferred" HideTarget="no" Impersonate ="no" Return="check"/>
<CustomAction Id="actionUninstall" BinaryKey="actionBinary" DllEntry="Uninstall" Execute="deferred" HideTarget="no" Impersonate ="no" Return="check"/>
<CustomAction Id="actionRemoveOldDatabase" BinaryKey="actionBinary" DllEntry="RemoveOldDatabase" Execute="deferred" HideTarget="no" Impersonate ="no" Return="ignore"/>
<CustomAction Id="actionGetNetworkComputers" BinaryKey="actionBinary" DllEntry="GetNetworkComputers" Execute="immediate" Return="check"/>
<CustomAction Id="SetInstallParameters" Return="check" Property="actionInstall" Value="InstallDir=[INSTALLDIR];ServerName=[SERVER_LIST];InstallMode=[SETUP_MODE];Single=[single];RemoveDatabase=[REMOVE_DATABASE]" />
<CustomAction Id="SetUninstallParameters" Return="check" Property="actionUninstsall" Value="UnInstallDir=[INSTALLDIR];ServerName=[SERVER_LIST];UnInstallMode=[INSTALL_MODE]" />
<CustomAction Id="SetRemoveOldDatabaseParameters" Return="check" Property="actionRemoveOldDatabase" Value="InstallDir=[INSTALLDIR];RemoveDatabase=[REMOVE_DATABASE]" />
<InstallExecuteSequence>
<Custom Action='AlreadyUpdated' After='FindRelatedProducts'>SELFFOUND</Custom>
<Custom Action='NoDowngrade' After='FindRelatedProducts'>NEWERFOUND</Custom>
<Custom Action="SetRemoveOldDatabaseParameters" Before="ProcessComponents"/>
<Custom Action="actionRemoveOldDatabase" After="SetRemoveOldDatabaseParameters">NOT Installed AND NOT UPGRADINGPRODUCTCODE</Custom>
<Custom Action="SetInstallParameters" Before="actionInstall"/>
<Custom Action="SetUninstallParameters" Before="RemoveFiles">Installed AND NOT REINSTALL AND NOT UPGRADINGPRODUCTCODE</Custom>
<Custom Action="actionInstall" Before="InstallFinalize">NOT Installed AND NOT UPGRADINGPRODUCTCODE</Custom>
<Custom Action="actionUninstall" After="SetUninstallParameters">Installed AND NOT REINSTALL AND NOT UPGRADINGPRODUCTCODE</Custom>
</InstallExecuteSequence>
有什么问题? 正如你所看到的,actionRemoveOldDatabase应该安装程序开始复制新文件(已经SetRemoveOldDatabaseParameters设置paremeters)之前trigerred。 所以-只有旧文件应删除-但是这不会发生。 如果我这样做事,行动actionRemoveOldDatabase,安装目录将被安装后复制新文件将其删除。 所以- 由安装程序复制所有的新文件将被删除 。
我不为什么已了解? 如何删除旧的只有已经存在的文件夹,为什么我的自定义操作将删除所有文件复制?
[编辑]看来我已经知道原因。 在这种情况下,安装目录正在使用中(可能是Windows安装程序将其锁定),安装结束后,它的释放。 自定义操作会等到文件夹被释放,然后删除它。 可惜的是,为时已晚 - 文件夹中已包含新文件。
你知道有什么解决方法吗?