Installation Inno安装程序[UninstallDelete]删除除一个文件夹外的所有文件夹

Installation Inno安装程序[UninstallDelete]删除除一个文件夹外的所有文件夹,installation,inno-setup,Installation,Inno Setup,对于应用程序的安装和部署,我使用Inno Setup 5.5.4。我当前的安装结构如下: C:\MyApp C:\MyApp\app.exe C:\MyApp\FolderA C:\MyApp\FolderA\InstalledFile.txt C:\MyApp\FolderA\NewFile.txt C:\MyApp\FolderB C:\MyApp\FolderB\NewFile.txt ... C:\MyApp\Fol

对于应用程序的安装和部署,我使用Inno Setup 5.5.4。我当前的安装结构如下:

    C:\MyApp
    C:\MyApp\app.exe
    C:\MyApp\FolderA
    C:\MyApp\FolderA\InstalledFile.txt
    C:\MyApp\FolderA\NewFile.txt
    C:\MyApp\FolderB
    C:\MyApp\FolderB\NewFile.txt
    ...
    C:\MyApp\FolderZ
    [UninstallDelete]
    Type: filesandordirs; Name: C:\MyApp\FolderB
    Type: filesandordirs; Name: C:\MyApp\FolderC
    ...
    Type: filesandordirs; Name: C:\MyApp\FolderZ
     [UninstallDelete]
     Type: dirifempty; Name: C:\MyApp\FolderA
     Type: filesandordirs; Name: C:\MyApp\
卸载应用程序后,我希望删除应用程序可能创建的所有文件,但特定文件夹中存在的文件除外。(即
C:\MyApp\FolderA\NewFile.txt

我的第一次尝试是在[UninstallDelete]部分为我要清理的每个文件夹设置一个条目。如下所示:

    C:\MyApp
    C:\MyApp\app.exe
    C:\MyApp\FolderA
    C:\MyApp\FolderA\InstalledFile.txt
    C:\MyApp\FolderA\NewFile.txt
    C:\MyApp\FolderB
    C:\MyApp\FolderB\NewFile.txt
    ...
    C:\MyApp\FolderZ
    [UninstallDelete]
    Type: filesandordirs; Name: C:\MyApp\FolderB
    Type: filesandordirs; Name: C:\MyApp\FolderC
    ...
    Type: filesandordirs; Name: C:\MyApp\FolderZ
     [UninstallDelete]
     Type: dirifempty; Name: C:\MyApp\FolderA
     Type: filesandordirs; Name: C:\MyApp\

但是,我不喜欢这个解决方案,因为每次我给应用程序添加一个新的文件夹时,我都必须考虑修改安装程序。 第二种方法是仅在特定文件夹为空时删除该文件夹,然后将应用程序的根文件夹设置为删除。如下所示:

    C:\MyApp
    C:\MyApp\app.exe
    C:\MyApp\FolderA
    C:\MyApp\FolderA\InstalledFile.txt
    C:\MyApp\FolderA\NewFile.txt
    C:\MyApp\FolderB
    C:\MyApp\FolderB\NewFile.txt
    ...
    C:\MyApp\FolderZ
    [UninstallDelete]
    Type: filesandordirs; Name: C:\MyApp\FolderB
    Type: filesandordirs; Name: C:\MyApp\FolderC
    ...
    Type: filesandordirs; Name: C:\MyApp\FolderZ
     [UninstallDelete]
     Type: dirifempty; Name: C:\MyApp\FolderA
     Type: filesandordirs; Name: C:\MyApp\

第二种方法有效吗?有没有更合理的方法来实现这一点?

当进程访问文件时,不能将其删除。寻找导致它的原因。 在开始删除文件夹之前,请退出所有即将删除的应用程序和服务。确保没有其他应用程序访问您要删除的文件(记事本、word等)。有时,最好在结束其他进程后等待几秒钟,然后再删除已使用的文件(也许其他人可以解释)

我曾经遇到过一个案例,我们无法找到卸载程序无法删除文件的原因。过了很长一段时间,我们发现一个正在运行的apachemonitor.exe正在访问一个日志文件,我们以前没有终止该进程。很难找到阻塞进程,但尤其是当它总是同一个文件不能删除时,您最好查找您安装和使用的进程,以便使安装程序正常工作

若要删除文件夹中除特殊文件以外的所有文件,则应在卸载程序中使用Pascal脚本。 函数引用()在这里帮助很大

您可以使用
FindFirst
FindNext
FindClose
在目录上迭代。调用
DelTree(DirName,true,true,true)
DeleteFile
获取所有要删除的项目


如果
CurUninstallStep=uspostdunload
,则在
CurUninstallStepChanged
事件中执行该代码。另一种防止卸载时删除文件的方法是 使用参数标志:

uninseneveruninstall在[文件]部分中

来自帮助的信息:

永远不要删除该文件。此标志在安装非常有用的软件时非常有用 在任何情况下都不应删除的公用共享文件, 例如MFC DLL


注意:如果此标志与sharedfile标志结合使用,则在卸载时将永远不会删除该文件,但引用计数仍将正确减少。

感谢您的回答,但这不是问题所在。我想找出的是从应用程序文件夹中删除所有文件(不属于安装的一部分)的最佳方法,我指定的文件除外。我正在寻找类似“删除我的应用程序文件夹下除文件夹A以外的所有剩余文件”的内容。