Inno setup Inno安装程序在安装过程中有时无法更改文件
在Inno安装过程中,我正在将文件添加到zip存档中,请参见此处:。我在添加文件后,立即通过将文件扩展名从.zip更改为.doc来重命名存档 用于重命名的代码为:Inno setup Inno安装程序在安装过程中有时无法更改文件,inno-setup,Inno Setup,在Inno安装过程中,我正在将文件添加到zip存档中,请参见此处:。我在添加文件后,立即通过将文件扩展名从.zip更改为.doc来重命名存档 用于重命名的代码为: RenameFile(ExpandConstant('{app}\MyFile.zip'), expandconstant('{app}\MyFile.doc')) 虽然它在Windows7和Windows8下工作得很好,但它的可靠性已经降低,有时只能在Windows10下工作 请注意,我尝试过的内容包括: 增加睡眠;但这不起
RenameFile(ExpandConstant('{app}\MyFile.zip'), expandconstant('{app}\MyFile.doc'))
虽然它在Windows7和Windows8下工作得很好,但它的可靠性已经降低,有时只能在Windows10下工作
请注意,我尝试过的内容包括:
增加睡眠;但这不起作用。。。
根据接受的答案复制具有不同名称的文件:
寻找建议,以制定可靠的解决方案和/或调试技巧
[编辑:添加了代码…重命名了一些位以便于阅读]
function SetFileAttributes(lpFileName : String; dwAttribs : LongInt) : Boolean;
external 'SetFileAttributesA@kernel32.dll stdcall';
procedure RepackZip();
var
ResultCode, i: Integer;
x1, x2: string;
begin
// Find files
x1 := FindFile('xmlns="sl:SLA"');
x2 := FindFile('xmlns="sl:SLB"');
log(ExpandConstant('{app}'));
// 2. Copy files to archive
SetFileAttributes ((expandconstant('{app}\MyFile.zip')), 0);
if not FileCopy(ExpandConstant('{tmp}\SLA.xml'), ExpandConstant('{app}\Temp\customXml\') + x1, False) then
MsgBox(x1 + 'failed!', mbError, MB_OK);
if not FileCopy(ExpandConstant('{tmp}\SLB.xml'), ExpandConstant('{app}\Temp\customXml\') + x2, False) then
MsgBox(x2 + 'failed!', mbError, MB_OK);
CopyToArchive();
SetFileAttributes ((expandconstant('{app}\MyFile.zip')), 0);
sleep(100);
// HAVE TRIED COPY & RENAME
// Everything works up to here and both FileCopy and FileRename fail on the same computers (permissions?)
// Have told Inno to Require Admin, makes no difference.
//RenameFile(ExpandConstant('{app}\MyFile.zip'), expandconstant('{app}\MyFile.dotm'))
FileCopy(ExpandConstant('{app}\MyFile.zip'), ExpandConstant('{app}\MyFile.doc'), false);
For i := 0 to 5 do
begin
if not FileExists(ExpandConstant('{app}\MyFile.doc')) then
begin
sleep (250);
end
else begin
// SetFileAttributes ((expandconstant('{app}\MyFile.doc')), 1);
exit;
end;
end;
if not FileExists(expandconstant('{app}\MyFile.doc')) then
MsgBox('Failed - rename archive to .doc', mbError, MB_OK);
end;
和CopyToArchive这是有效的-但我想知道CopyToArchive是否会以某种方式保持存档打开并阻止重命名:
procedure CopyToArchive(); //(const Archive, Content: string);
var
Shell: Variant;
Folder: Variant;
Archive, Content: string;
objFSO, h: Variant;
max0, max1: integer;
begin
Shell := CreateOleObject('Shell.Application');
Archive := ExpandConstant('{app}') + '\MyFile.zip';
Folder := Shell.NameSpace(Archive);
log('Archive Location: ' + Archive);
objFSO := CreateOleObject('Scripting.FileSystemObject');
h := objFSO.getFile(Archive);
Content := ExpandConstant('{app}\Temp\customXml\');
Folder.CopyHere(Content, $0100);
sleep(2000);
end;
我开始研究的一件事是使用objFSO重命名存档,但我无法解决它…有两个问题: .CopyHere调用是异步的。调用后,您必须等待归档完成。虽然睡眠不是真的可以实现,但它应该可以实现。CopyHere实际上不会锁定文件,因此不会阻止重命名,但您可能会重命名一个不完整的文件。 导致重命名失败的原因是调用objFSO.getFileArchive,它会锁定文件,而您永远不会解锁它。实际上你从来没有用过h。所以,取消那个电话。
为什么不在存档之前重命名文件?它可以防止所有这些问题。谢谢大家,不管怎样,只要有兴趣,我都会看一看,WiX:MS使用他们自己来编写SQL安装程序…所以我安装了WiX和。。。如果我点击WiX工具集,它只会带我回到它来自的网站。。。出口搜索WiX,打开桌面应用,嗯?所以让我直说吧。。。这是一个安装程序,它甚至不能自行安装??安装WiX时从来没有遇到过问题。安装后,您可以通过创建WiX项目,使用Visual Studio编写安装程序。哦。。。我实际上并没有使用VS,我是在MS Office内部的VBA中。。。所以如果我打开VS…,谢谢,我会做一些测试,然后报告。我想我试过用h注释掉,但是没有用,我可能会让睡眠时间长得可笑…注释掉h并添加一个愚蠢的大延迟20sec,现在起作用了。。。我看看我能耽搁多久。