应用程序无法在启动时访问文件
Application cant access file on startup
我正在做一个应用程序(XE6,Firemonkey)来同步共享文件夹和 computer/s 之间的文件。此应用程序每 x 小时检查一次是否有新文件要同步,并在 windows 启动时启动。
我可以做任何事情,我的应用程序在启动时启动,它会进行同步,只要我是启动它的人。当应用程序在启动时自动启动时,它给了我一个异常 "EINOUTERROR" - 文件访问被拒绝。
在启动应用程序时读取一个小的 .txt 文件以自行设置(共享文件夹位置、同步率等),我的猜测是因为它 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 技术了。
我正在做一个应用程序(XE6,Firemonkey)来同步共享文件夹和 computer/s 之间的文件。此应用程序每 x 小时检查一次是否有新文件要同步,并在 windows 启动时启动。
我可以做任何事情,我的应用程序在启动时启动,它会进行同步,只要我是启动它的人。当应用程序在启动时自动启动时,它给了我一个异常 "EINOUTERROR" - 文件访问被拒绝。 在启动应用程序时读取一个小的 .txt 文件以自行设置(共享文件夹位置、同步率等),我的猜测是因为它 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 技术了。