delphi - 应用程序无法在启动时访问文件

标签 delphi startup firemonkey delphi-xe6

我正在做一个应用程序(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/

相关文章:

android - 昏暗的屏幕 Android Firemonkey

delphi - 启用运行时主题时,不显示 PngBitBtn 的标题

delphi - 如何在XE6上解析 "ITaskbarList3 interface is not supported on this OS version"

windows - 为什么我的 Delphi 6 程序在安装时仅在少数 Windows 7 系统 (InnoSetup) 上触发管理员权限请求?

linux - 如何在 CentOS 5.10 上为已安装的 STUNNEL 创建服务

C#:在给定时间以编程方式启动计算机

delphi - FastMM 报告记录线程变量内存泄漏

google-app-engine - Google App Engine 重新部署后第一次处理请求需要很长时间?

delphi - XE7 FMX 损坏的 PNG 缩略图

delphi - FMX TMemo 和 BeginUpdate