C# 如何在卸载时删除应用程序文件夹

C# 如何在卸载时删除应用程序文件夹,c#,windows-installer,installation,managedinstallerclass,C#,Windows Installer,Installation,Managedinstallerclass,我已经使用VS2010中的安装项目创建了一个安装程序。它将我的应用程序安装到ProgramFiles文件夹中,比如说XXX。我的应用程序进一步将一些文件和文件夹创建到XXX文件夹中。卸载时,删除安装程序创建的所有内容,而应用程序创建的文件和文件夹仍保留在XXX中 我使用installerclass编写了一些自定义代码来删除文件夹(XXX),但在用户从控制面板卸载时不执行,而在从我创建的安装程序卸载时成功执行 我认为您不应该为此编写任何自定义代码,如果您的所有文件都标记为临时文件而不是永久文件,这

我已经使用VS2010中的安装项目创建了一个安装程序。它将我的应用程序安装到ProgramFiles文件夹中,比如说XXX。我的应用程序进一步将一些文件和文件夹创建到XXX文件夹中。卸载时,删除安装程序创建的所有内容,而应用程序创建的文件和文件夹仍保留在XXX中

  • 我使用installerclass编写了一些自定义代码来删除文件夹(XXX),但在用户从控制面板卸载时不执行,而在从我创建的安装程序卸载时成功执行


  • 我认为您不应该为此编写任何自定义代码,如果您的所有文件都标记为临时文件而不是永久文件,这将由MSI引擎直接处理


    使用文件夹、文件和安装项目本身的配置和属性,无需编写代码即可获得所需的内容。

    第一步是修改应用程序,使其将数据写入每个用户位置,而不是应用程序文件夹。例如,您可以使用当前用户AppData目录中的自定义文件夹。这样可以避免与权限相关的问题

    要删除此文件夹,确实可以使用自定义操作。如果它是在安装项目中的“卸载”下添加的,则应同时为“控制面板”和“软件包”卸载运行


    尝试创建并搜索自定义操作名称,看看会发生什么。

    我猜您删除文件的自定义操作安排在UI部分。从“控制面板”启动卸载时,它将以最小UI模式运行,并跳过所有对话框

    您的自定义操作必须安排在
    InstallExecute
    表中。

    (为了与UAC兼容,必须使用noimpersonate延迟。但是您的应用程序本身与UAC不兼容,所以这并不重要。)

    不要这样做首先,用户通常不喜欢在没有警告的情况下删除他们放在应用程序目录中的数据文件(例如,他们可能只是因为想将其移动到其他驱动器而卸载)。如果最终用户愿意,最好让他们手动删除它们。此外,如果用户错误地将程序安装在错误的目录中(例如,C:\WINDOWS),然后去卸载它,可能会造成灾难性的后果。或者,如果用户将其珍贵的色情视频隐藏在应用程序文件夹中怎么办?再说一次,不要这样做

    @Davide我知道这并不能回答您的问题,但您应该避免在应用程序安装文件夹中写入任何内容-没有适当权限的用户可能会导致您的应用程序失败。(OTOH,我承认,即使您写信给AddData或类似公司,您的卸载问题仍然存在…)感谢Davide的建议,我会记住这一点。您能帮我获得有关上述问题的详细解决方案吗?在我的例子中,我的应用程序也在运行时创建了一些文件,这导致从控制面板卸载MSI的过程不会删除包含这些文件的文件夹。我的要求是卸载MSI时,应删除wwwroot文件夹中的所有文件夹,并且wwwroot文件夹必须是干净的。你能在这个问题上帮助我吗?我使用powershell脚本卸载msi,在这段代码中,我现在调用以下powershell来帮助我删除文件夹中的所有文件夹:删除项目“C:\Temp\Fldr*”-强制-递归-ErrorAction SilentlyContinue,它解决了问题。