Inno Setup [UninstallDelete] 删除除一个文件夹以外的所有文件夹
Inno Setup [UninstallDelete] delete all except one folder
为了安装和部署我的应用程序,我使用的是 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
卸载应用程序后,我想删除所有可能由应用程序创建的文件,特定文件夹中的文件除外。 (即 C:\MyApp\FolderA\NewFile.txt
)。
我的第一个尝试是在 [UninstallDelete] 部分为每个要清理的文件夹设置一个条目。类似于以下内容:
[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-Script。
函数参考 (http://www.jrsoftware.org/ishelp/index.php?topic=scriptfunctions) 在这里有很大帮助。
您可以使用 FindFirst
、FindNext
、FindClose
来遍历目录。为您要删除的所有项目调用 DelTree(DirName, true, true, true)
或 DeleteFile
。
如果 CurUninstallStep=usPostUninstall
.
,则在 CurUninstallStepChanged
事件中执行该代码
另一种防止卸载时删除文件的方法是
使用参数标志:
uninsneveruninstall;
in section [Files]
来自帮助的信息:
uninsneveruninstall
Never remove the file. This flag can be useful when installing very
common shared files that shouldn't be deleted under any circumstances,
such as MFC DLLs.
注意 : 如果此标志与 sharedfile 标志结合使用,文件在卸载时将永远不会被删除,但引用计数仍会适当减少。
为了安装和部署我的应用程序,我使用的是 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
卸载应用程序后,我想删除所有可能由应用程序创建的文件,特定文件夹中的文件除外。 (即 C:\MyApp\FolderA\NewFile.txt
)。
我的第一个尝试是在 [UninstallDelete] 部分为每个要清理的文件夹设置一个条目。类似于以下内容:
[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-Script。 函数参考 (http://www.jrsoftware.org/ishelp/index.php?topic=scriptfunctions) 在这里有很大帮助。
您可以使用 FindFirst
、FindNext
、FindClose
来遍历目录。为您要删除的所有项目调用 DelTree(DirName, true, true, true)
或 DeleteFile
。
如果 CurUninstallStep=usPostUninstall
.
CurUninstallStepChanged
事件中执行该代码
另一种防止卸载时删除文件的方法是
使用参数标志:
uninsneveruninstall;
in section [Files]
来自帮助的信息:
uninsneveruninstall
Never remove the file. This flag can be useful when installing very common shared files that shouldn't be deleted under any circumstances, such as MFC DLLs.
注意 : 如果此标志与 sharedfile 标志结合使用,文件在卸载时将永远不会被删除,但引用计数仍会适当减少。