使用InnoSetup编译时出现错误的“文件正在被另一个进程使用...”消息

16
虽然我非常喜欢InnoSetup,但我一直在遭受这个错误信息的困扰,但我的挫败感已经达到了新的高度。有许多帖子抱怨这个问题,这显然是InnoSetup的一个错误,但我找不到任何有用的解决方法。
我有一个非常简单的(签名)安装程序,只是复制一些文件并创建一个快捷方式。它甚至没有包括可执行文件。当我尝试编译安装程序时,我一遍又一遍地收到"由于正在被其他进程使用,无法访问文件"的消息(通常情况下,我都可以在3次尝试内编译安装程序),但现在尝试了很多次后似乎毫无意义。从InnoSetup输出或错误对话框中并不清楚哪个文件正在"使用中"。绝对不会有竞争性进程正在运行。(我已经重新启动了计算机,仍然收到这个消息)。
如何解决这个问题的任何想法都将不胜感激。
以下是完整的设置代码——它已经签名,但与我使用相同签名创建的其他设置程序没有问题。
#define MyAppName "Easy-IAP for IronKey"
#define MyAppVersion "4.0"
#define MyAppPublisher "Command Post Solutions"
#define MyAppURL "http://www.commandpostsolutions.com/"

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{51668D56-27F6-4C83-87F2-677328EFE808}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName="\EZ-IAP"
DefaultGroupName={#MyAppName}
DisableProgramGroupPage=yes
OutputBaseFilename=IronKeySetup
SetupIconFile=C:\Users\ron\Dropbox\EZIAP\eziap.ico
Compression=lzma
SolidCompression=yes
SignedUninstaller=yes
SignTool=Standard /d $qEasy-IAP Installer$q $f                                                                   

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"

[Files]
Source: "C:\Users\ron\Dropbox\Easy-IAP for IronKey\AccessDatabaseEngine.exe"; DestDir: "{app}"; Flags: onlyifdoesntexist
Source: "C:\Users\ron\Dropbox\Easy-IAP for IronKey\dotNetFx40_Full_x86_x64.exe"; DestDir: "{app}"; Flags: onlyifdoesntexist
Source: "C:\Users\ron\Dropbox\Easy-IAP for IronKey\Easy-IAP for IronKey\bin\Release\Easy-IAP for IronKey.exe"; DestDir: "{app}";
; NOTE: Don't use "Flags: ignoreversion" on any shared system les
[ICONS]
Name: "{drive:{app}}\Easy-IAP"; Filename: "{app}\Easy-IAP for IronKey.exe"; 

3
可以将源文件复制到其他地方,而不是保留在Dropbox目录中,因为该目录可能被锁定为“仅用于同步”? - RobeN
4
由于答案通常都是“禁用您的防病毒软件”,我相信在这里也是如此。 - Deanna
2
感谢您的建议,@RobeN - 它拯救了我的理智!虽然在我的情况下,有效的方法是将源文件保留在Dropbox中,但将Inno的OutputDir设置为非Dropbox文件路径。我想一旦Dropbox看到创建的构建文件,它就会锁定它,因此Inno无法再访问刚刚开始的构建。 - Dr Marble
10个回答

34

我有同样的问题。 这是由于 McAfee 杀毒软件正在运行实时扫描正在编译的 exe 文件... 由于似乎无法从实时扫描中排除一个目录,所以我在 McAfee SecurityCenter 中关闭了它,现在一切正常。 希望这能帮到你。


Avira Antivirus最近也开始这样做了...我不得不禁用其实时保护以编译安装文件。 - Kefik
我似乎找不到如何从安全中心关闭 McAfee? - ron tornambe
是的,这解决了问题。但您不必禁用实时保护,只需将其添加到您的防病毒软件白名单中即可。 - Netherdan
谢谢!我不明白为什么我会遇到这个问题,而且我的工作电脑里的防病毒软件被系统管理员锁定了。我需要在虚拟机上编译它,这就是为什么 Windows 不好用的原因。 - blkpws
2
因此,Windows Defender也是如此。我将输出目录添加到排除列表中。 - Muhammad Saqib
我的问题是由于“Spyhunter 5”引起的...我都快抓狂了! - Robert Koernke

15

问题通常是一个资源管理器窗口打开并查看输出文件将要驻留的文件夹。

资源管理器会不断地打开可执行文件,试图获取它的图标和其他元数据。关闭任何正在查看输出文件夹的打开的资源管理器窗口,然后再尝试一次。

因此,您最好从命令行或Visual Studio或其他自动化构建过程的一部分运行您的inno setup文件。


2
这对我有用。谢谢... 真是浪费时间! - Andy
1
是的,那就是原因,看起来innosetup需要正确地锁定文件。 - Jay M
1
是的,谢谢! - autonomy

6
这不是bug,而只是应用程序设计不良(或文档不好)的结果 :)
在你的[Setup]部分使用OutputDir指令可以避免这种错误行为。
OutputDir=c:\output

OutputDir指定脚本的 "输出" 目录,也就是安装程序编译器会将生成的SETUP.*文件放置的地方。默认情况下,它会在包含该脚本的目录下创建一个名为Output的目录。

你可能会问为什么?

如果你没有在脚本文件中使用 OutputDir (许多人确实不使用它),Inno Setup 会尝试在 "userdocs:" 文件夹中创建生成的安装程序,这会在所有 Windows 系统上引起很多麻烦。

即使你想在当前文件夹中拥有生成的安装程序,请始终使用此参数,在这种情况下,请使用:

OutputDir=output

5
如果您的脚本文件中未使用OutputDir,Inno Setup会尝试在"userdocs:"文件夹中创建安装程序。不,它不会这样做。如果您省略此指令,InnoSetup会在CurrentScriptFolder\Output文件夹中创建输出;只有在脚本还没有保存且您不使用OutputDir指令时,输出才会在"userdocs:"文件夹中。 - TLama
非常感谢你,你解除了我的巨大困扰。我现在真的很喜欢InnoSetup。 - ron tornambe
有时候当我打开输出目录时,仍然会出现这个错误。所以我猜测Windows(10)文件资源管理器也可能会导致这个错误。 - Tithen-Firion

1

Win 7 Pro/64,InnoSetup 5.5.5(a):我遇到了完全相同的InnoSetup编译问题。在更改项目中使用的文件夹属性和通过撤销共享输出后,所有问题都得到了解决。结论是最好不要在共享文件夹中使用InnoSetup。


请勿重新发布现有答案。此问题已经有许多在3年前发布的答案,您的发布不会给读者带来任何好处。 - Marki555
我不同意。我的解决方案没有在答案中提到,但在现实世界中是有效的。 - Włodzimierz Bień
我非常确定我的帖子会帮助遇到条目中提到的问题的人,因为现在许多IDE默认使用“..\users\documents..”目录来创建项目文件夹树。该目录通常具有“共享文件夹”属性。在这样的环境中使用InnoSetup会导致问题,这也是我来到这里的原因。 - Włodzimierz Bień

1
我设置了OutputDir = x:]setup,但错误仍然存在。如果我重启我的机器并将构建作为第一个任务,则构建将成功。

0

当OutputDir="."时(意思是将输出放在与源文件相同的目录中),我遇到了这个问题。每隔一次构建就会失败。

我通过修改我的PowerShell构建脚本来解决它,删除整个输出目录,然后构建我的应用程序(自动创建该目录),然后运行iscc来创建setup.exe。


0

错误可能是由于您尝试复制与Windows服务链接的文件夹造成的。

要解决此问题,请改用[Code]部分,而不是将文件夹放在[Files]中。这样可以让您检查文件夹是否存在,关闭关联的 Windows 服务,最后再复制文件夹。


0

我尝试了以上所有的建议,但都无法解决问题。于是我将版本从6.2切换回6.0.2,问题终于得到了解决。


0

我曾经遇到过同样的问题,解决方法已经在上面提到了。另一个导致这个错误的原因是当你编译的.exe输出文件在你放置Inno Setup输出目录的目录中已经有相同的名称时,就会出现这个错误。 换句话说,在编译时,你需要在创建文件名时加入一些特殊字符,比如“-”或“_”,以避免出现这个错误信息。


0

我在我的工作机器上尝试了各种文件夹,但都没有解决问题。最终,我通过使用以下方法获得了成功:

OutputDir=C:\Users\userid\Downloads 

(将“userid”替换为您的特定帐户)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接