【发布时间】:2015-04-28 20:08:49
【问题描述】:
最近我遇到了一个文件创建问题,当我的 delphi 应用程序使用开始菜单或桌面快捷方式执行时,即使它以管理员身份运行。如果我以管理员身份直接从其文件夹中运行它,则没有问题。
基本上我已经创建了一个使用 zipforge 存档器构建 SFX 存档的 delphi 32 位 GUI 程序。如果我从例如运行程序C:\myProgramFolder,应用程序运行正常并将存档构建到指定的输出文件夹,但是,当我使用快捷方式运行它时,我得到 I/O 105。我想这应该是与 Win7 安全策略有关的问题,但也许有人曾经处理过这种问题,所以我会非常感谢任何建议。
这是一个导致 I/O 105 的过程:
quickfix.ini 是一个用于为 SFX 存根提供显示信息的文件,这就是它存在的原因
procedure TfrmMain.Buildinstaller1Click(Sender: TObject);
var
presentPath: string;
begin
presentPath := ExtractFilePath(Application.ExeName);
SynEdit1.Lines.SaveToFile(presentPath + '\quickfix.ini');
CopyFile(pchar(presentPath + '\quickfix.ini'),
pchar(edSourcePath.Text + '\quickfix.ini'), false);
CopyFile(pchar(presentPath + '\bin\Uninstall.exe'),
pchar(edSourcePath.Text + '\Uninstall.exe'), false);
DeleteFile(presentPath + '\quickfix.ini');
if (edSourcePath.Text <> '') and (edOutPutPath.Text <> '') then begin
saveExe.InitialDir := edOutPutPath.Text;
if saveExe.Execute() then begin
frmProgress.Show;
try
// this is a line where the problem begins
with archiver do begin
TempDir := GetTempDirectory;
FileName := saveExe.FileName;
OpenArchive(fmCreate);
BaseDir := edSourcePath.Text;
AddFiles('*.*');
CloseArchive();
end;
except
on E: Exception do begin
writeln('Exception: ', E.Message);
Readln;
frmProgress.ProgressBar1.Position := 0;
frmProgress.Close;
end;
end;
end;
MessageDlg('QuickFix install successfully built!', mtInformation,
[mbOk], 0);
frmProgress.Close;
end else begin
MessageDlg('Source and/or output path not set. Please review.',
mtInformation, [mbOk], 0);
end;
end;
【问题讨论】:
-
GUI 或控制台应用程序? 32 位还是 64 位?您如何“构建 SFX 存档”(从头开始,从 3rd 方代码)?什么类型的文件 I/O(旧的 Pascal、TStream 等)?您要写入的目标文件夹是什么?这里没有足够的信息来回答这个问题;你问的是一个描述模糊的问题。
-
32 位 gui,使用 zipforge 构建 sfx。另一件事是,如果我直接从包含文件夹以管理员身份运行我的应用程序,没有问题,但如果我使用桌面快捷方式以管理员身份运行它,它不会让我创建它。我完全被困住了......
-
那么你在 Program Files 中的某个地方编写,这在大多数情况下在 Windows Vista 和更高版本下是不允许的。修复您的代码,使其不这样做。 (I/O 错误 105 是 File not open for writing,根据文档,这是由于在没有打开控制台窗口的情况下使用 Write/WriteLn 引起的。)
-
对不起。您已在此处接受了答案,这表明您已找到解决方案。我没有建议。
-
这正是大卫所说的。您不应该将临时文件写入程序文件文件夹。您是否知道硬盘上除了程序文件夹之外的其他位置可能是您编写文件的更好位置? Microsoft 不希望您做您正在做的事情。别了。