卸载WiX时删除文件

卸载WiX时删除文件

卸载我的应用程序时,我想配置Wix设置以删除原始安装后添加的所有文件。看起来卸载程序只删除了最初从MSI文件安装的目录和文件,并且它保留了稍后在应用程序文件夹中添加的所有其他内容。换句话说,我想在卸载时清除目录。我怎么做?



温温酱
浏览 1010回答 3
3回答

哈士奇WWW

使用RemoveFile元素和On =“&nbsp;uninstall&nbsp;”。这是一个例子:<Directory&nbsp;Id="CommonAppDataFolder"&nbsp;Name="CommonAppDataFolder"> &nbsp;&nbsp;<Directory&nbsp;Id="MyAppFolder"&nbsp;Name="My"> &nbsp;&nbsp;&nbsp;&nbsp;<Component&nbsp;Id="MyAppFolder"&nbsp;Guid="*"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<CreateFolder&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<RemoveFile&nbsp;Id="PurgeAppFolder"&nbsp;Name="*.*"&nbsp;On="uninstall"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;</Component> &nbsp;&nbsp;</Directory></Directory>更新它不起作用100%。它删除了文件,但没有删除任何其他目录 - 安装后创建的目录。有什么想法吗?&nbsp;- pribeiro遗憾的是,Windows Installer不支持使用子目录删除目录。在这种情况下,您必须采取自定义操作。或者,如果您知道子文件夹是什么,请创建一堆RemoveFolder和RemoveFile元素。

神不在的星期二

RemoveFolderEx在WiX中使用Util扩展中的元素。使用此方法,还会删除所有子目录(而不是直接使用RemoveFile元素)。此元素在MSI数据库中添加临时行RemoveFile和RemoveFolder表。

HUH函数

为此,我只是创建了一个在卸载时调用的自定义操作。WiX代码如下所示:<Binary&nbsp;Id="InstallUtil"&nbsp;src="InstallUtilLib.dll"&nbsp;/><CustomAction&nbsp;Id="DIRCA_TARGETDIR"&nbsp;Return="check"&nbsp;Execute="firstSequence"&nbsp;Property="TARGETDIR"&nbsp;Value="[ProgramFilesFolder][Manufacturer]\[ProductName]"&nbsp;/><CustomAction&nbsp;Id="Uninstall"&nbsp;BinaryKey="InstallUtil"&nbsp;DllEntry="ManagedInstall"&nbsp;Execute="deferred"&nbsp;/><CustomAction&nbsp;Id="UninstallSetProp"&nbsp;Property="Uninstall"&nbsp;Value="/installtype=notransaction&nbsp;/action=uninstall&nbsp;/LogFile=&nbsp;/targetDir=&quot;[TARGETDIR]\Bin&quot;&nbsp;&quot;[#InstallerCustomActionsDLL]&quot;&nbsp;&quot;[#InstallerCustomActionsDLLCONFIG]&quot;"&nbsp;/><Directory&nbsp;Id="BinFolder"&nbsp;Name="Bin"&nbsp;> &nbsp;&nbsp;&nbsp;&nbsp;<Component&nbsp;Id="InstallerCustomActions"&nbsp;Guid="*"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<File&nbsp;Id="InstallerCustomActionsDLL"&nbsp;Name="SetupCA.dll"&nbsp;LongName="InstallerCustomActions.dll"&nbsp;src="InstallerCustomActions.dll"&nbsp;Vital="yes"&nbsp;KeyPath="yes"&nbsp;DiskId="1"&nbsp;Compressed="no"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<File&nbsp;Id="InstallerCustomActionsDLLCONFIG"&nbsp;Name="SetupCA.con"&nbsp;LongName="InstallerCustomActions.dll.Config"&nbsp;src="InstallerCustomActions.dll.Config"&nbsp;Vital="yes"&nbsp;DiskId="1"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;</Component></Directory><Feature&nbsp;Id="Complete"&nbsp;Level="1"&nbsp;ConfigurableDirectory="TARGETDIR"> &nbsp;&nbsp;&nbsp;&nbsp;<ComponentRef&nbsp;Id="InstallerCustomActions"&nbsp;/></Feature><InstallExecuteSequence> &nbsp;&nbsp;&nbsp;&nbsp;<Custom&nbsp;Action="UninstallSetProp"&nbsp;After="MsiUnpublishAssemblies">$InstallerCustomActions=2</Custom> &nbsp;&nbsp;&nbsp;&nbsp;<Custom&nbsp;Action="Uninstall"&nbsp;After="UninstallSetProp">$InstallerCustomActions=2</Custom></InstallExecuteSequence>InstallerCustomActions.DLL中的OnBeforeUninstall方法的代码如下所示(在VB中)。Protected&nbsp;Overrides&nbsp;Sub&nbsp;OnBeforeUninstall(ByVal&nbsp;savedState&nbsp;As&nbsp;System.Collections.IDictionary) &nbsp;&nbsp;&nbsp;&nbsp;MyBase.OnBeforeUninstall(savedState) &nbsp;&nbsp;&nbsp;&nbsp;Try &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;CommonAppData&nbsp;As&nbsp;String&nbsp;=&nbsp;Me.Context.Parameters("CommonAppData") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;CommonAppData.StartsWith("\")&nbsp;And&nbsp;Not&nbsp;CommonAppData.StartsWith("\\")&nbsp;Then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CommonAppData&nbsp;=&nbsp;"\"&nbsp;+&nbsp;CommonAppData&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;If &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;targetDir&nbsp;As&nbsp;String&nbsp;=&nbsp;Me.Context.Parameters("targetDir") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;targetDir.StartsWith("\")&nbsp;And&nbsp;Not&nbsp;targetDir.StartsWith("\\")&nbsp;Then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;targetDir&nbsp;=&nbsp;"\"&nbsp;+&nbsp;targetDir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;If &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteFile("<filename.extension>",&nbsp;targetDir)&nbsp;'delete&nbsp;from&nbsp;bin&nbsp;directory &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteDirectory("*.*",&nbsp;"<DirectoryName>")&nbsp;'delete&nbsp;any&nbsp;extra&nbsp;directories&nbsp;created&nbsp;by&nbsp;program &nbsp;&nbsp;&nbsp;&nbsp;Catch &nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;TryEnd&nbsp;SubPrivate&nbsp;Sub&nbsp;DeleteFile(ByVal&nbsp;searchPattern&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;deleteDir&nbsp;As&nbsp;String) &nbsp;&nbsp;&nbsp;&nbsp;Try &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For&nbsp;Each&nbsp;fileName&nbsp;As&nbsp;String&nbsp;In&nbsp;Directory.GetFiles(deleteDir,&nbsp;searchPattern) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File.Delete(fileName) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Next &nbsp;&nbsp;&nbsp;&nbsp;Catch &nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;TryEnd&nbsp;SubPrivate&nbsp;Sub&nbsp;DeleteDirectory(ByVal&nbsp;searchPattern&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;deleteDir&nbsp;As&nbsp;String) &nbsp;&nbsp;&nbsp;&nbsp;Try &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For&nbsp;Each&nbsp;dirName&nbsp;As&nbsp;String&nbsp;In&nbsp;Directory.GetDirectories(deleteDir,&nbsp;searchPattern) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Directory.Delete(dirName) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Next &nbsp;&nbsp;&nbsp;&nbsp;Catch &nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;TryEnd&nbsp;Sub
打开App,查看更多内容
随时随地看视频慕课网APP