【问题标题】:Application cant access file on startup应用程序启动时无法访问文件
【发布时间】:2015-05-22 12:35:14
【问题描述】:

我正在做一个应用程序(XE6,Firemonkey)来同步共享文件夹和计算机之间的文件。此应用程序每 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 的代码段,我的应用程序启动并执行良好,但我不想每次都设置它。 在此先感谢

【问题讨论】:

    标签: delphi startup firemonkey delphi-xe6


    【解决方案1】:

    我认为这个问题与您使用相对路径有关。您在假设工作目录与包含可执行文件的目录相同的情况下编写了代码。不一定如此。

    例如,当您通过双击可执行文件启动应用程序时,shell 会确保初始工作目录是包含可执行文件的目录。但是,当 Windows 在启动时启动您的程序时,我怀疑工作目录是系统目录。当然,你的文件在那里找不到,你也无权在那里写。

    不要使用相对路径,而是使用文件的完整路径。

    FileName := ExtractFilePath(ParamStr(0)) + 'Dados.txt';
    

    或许

    FileName := TPath.Combine(ExtractFilePath(ParamStr(0)), 'Dados.txt');
    

    请注意,这也假设您的可执行文件位于您可以写入的文件夹中。通常情况并非如此,因此您可能需要找到其他位置。

    我不得不评论说,我发现将非常现代的 (FireMonkey) 与古老的 (Pascal I/O) 混合在一起有点不协调。也许是时候转向更现代的 I/O 技术了。

    【讨论】:

    • 是的,使用完整路径解决了这个问题。谢谢。通过说一种更现代的 I/O 技术,您有什么建议? (不要求代码,只是提醒我搜索和学习:))我是 Firemonkey 和 Delphi 的新手,古老的 Pascal I/O 是第一个出现在 google 上的东西。
    • 文件的内容是什么?
    • 纯文本。好吧,我有一组共享文件夹,我需要确保某些计算机保留这些共享文件夹的最新副本。我有一个存储该信息的类,起初我想序列化该类并将其存储在一个文件中,就像在 java 中一样,但我发现在 delphi 中很难。由于这是我的一个小项目,我尽量保持简单且耗时少。所以我编写了一个读取类并将其写入 txt 的程序,然后在应用程序启动时对其进行解释。
    • 您可以为此使用 SuperObject 或其他一些基于 JSON 的序列化库。这将序列化(和反序列化)简单的记录类型,而无需您付出任何努力。至于读写文本文件,想必是基于行的。因此,流读取器/写入器是迁移到现代 I/O 并保持与 Pascal I/O 相同的代码样式的简单方法。
    • 您可能不知道 Windows 可以直接执行您要编写的代码...windows.microsoft.com/en-us/windows-vista/…
    猜你喜欢
    • 2022-07-29
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多