我正在做一个应用程序(XE6,Firemonkey)来同步共享文件夹和计算机之间的文件。该应用程序每 x 小时检查一次是否有新文件需要同步,并在 Windows 启动时启动。
我可以做一切,我的应用程序在启动时启动,并且它会进行同步,只要我是启动它的人。当应用程序在启动时自动启动时,它会给我一个异常“EINOUTERROR”-文件访问被拒绝。 在启动应用程序时,会读取一个小的 .txt 文件来进行 self 设置(共享文件夹位置、同步速率等),我的猜测是,由于启动应用程序的 Windows 运行它时没有读取 .txt 的权限,但即使在将 .txt 权限更改为对每个人的完全控制都会产生相同的错误。
文件打开代码:
AssignFile(myFile,'Dados.txt');
if FileExists('Dados.txt') then
Append(myFile)
else
Rewrite(myFile);
FileMode := fmOpenRead;
Reset(myFile);
将应用程序置于启动程序的代码:
procedure TSyncM.RunOnStartup(const sCmdLine: string; bRunOnce: boolean; Remove: Boolean) ;
var sKey: string;
Section: string;
const ApplicationTitle = 'GEN4Sync';
begin
if (bRunOnce) then
sKey := 'Once'
else
sKey := '';
Section := 'Software\Microsoft\Windows\CurrentVersion\Run' + sKey + #0;
with TRegIniFile.Create('') do
try
RootKey := HKEY_CURRENT_USER;
if Remove then
DeleteKey(Section, ApplicationTitle)
else
WriteString(Section, ApplicationTitle, sCmdLine) ;
finally
Free;
end;
end;
如果我评论调用读取该 .txt 的代码片段,我的应用程序将启动并执行良好,但我不想每次都进行设置。 提前致谢
最佳答案
我认为该问题与您使用相对路径有关。您编写代码时假设工作目录与包含可执行文件的目录相同。事实并非如此。
例如,当您通过双击可执行文件来启动应用程序时,shell 会确保初始工作目录是包含可执行文件的目录。但是,当Windows在启动时启动您的程序时,我怀疑工作目录是系统目录。当然,在那里找不到您的文件,并且您无权在那里写入。
不要使用相对路径,而是使用文件的完整路径。
FileName := ExtractFilePath(ParamStr(0)) + 'Dados.txt';
或者也许
FileName := TPath.Combine(ExtractFilePath(ParamStr(0)), 'Dados.txt');
请注意,这还假设您的可执行文件位于您可以写入的文件夹中。通常情况并非如此,因此您可能需要寻找不同的位置。
我确实必须评论说,我发现你将非常现代的(FireMonkey)与古老的(Pascal I/O)混合在一起有点不协调。也许是时候转向更现代的 I/O 技术了。
关于delphi - 应用程序无法在启动时访问文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29143864/