【问题标题】:Lazarus(Pascal) RunError(5)Lazarus(Pascal) RunError(5)
【发布时间】:2014-05-21 06:16:10
【问题描述】:

我的程序以 RunError(5) 退出,这表明它无法访问应该可以访问的文件。我已经检查并且该文件按应有的方式使用,该文件不是只读的,等等。该程序所做的是,如果一个 .dat 文件不存在,它会创建一个文件并将其用于保存内容。如果我运行该程序并且该文件不存在,则创建该文件,但之后,在同一执行中,该程序将无法访问该文件。仅当文件是在当前执行中创建时才会发生这种情况。

这是调用过程的方式(代码很长,但我给你的是前几行,错误发生的地方):

 fileName := 'labSave.dat';
 CreateFile;
 assign(labyrinthFile,fileName);
 writeln(CheckFileSize);

然后是每个程序:

procedure Initialize;
begin
    fileName := 'labSave.dat';
    assign(labyrinthFile,fileName);
end;   

procedure CreateFile;
begin
    if not FileExists(fileName) then FileCreate(fileName);
end; 

function CheckFileSize: integer;
begin
    reset(labyrinthFile);
    CheckFileSize := FileSize(labyrinthFile);
    close(labyrinthFile);
end;

【问题讨论】:

  • 它实际上没有被分配,因为我重新安排了我的程序并省略了分配,但现在我修复了它,它仍然做同样的事情,但错误发生在 FileSize() 部分。已编辑的帖子。
  • 我说得对吗,如果文件不存在,你assign()首先然后之后创建它?所以创建的文件没有得到assign()。这显然是一个设计错误;)
  • 你是对的,但我不确定这是否重要,因为在我看来,即使它尚未创建,labyrinthFile 也将始终分配给该名称。无论如何,尝试使用 fileName 创建一个文件,然后将其分配给 labyrinthFile。仍然不行不知道。可能是有原因的。
  • 分配是通过将文件绑定到 var 而不是文件名来进行的。因此,分配必须在以任何方式创建之后。您还需要显示您的文件创建代码。
  • 我按照您告诉我的方式编辑了帖子,但仍然无法正常工作。

标签: pascal lazarus


【解决方案1】:

根据 Lazarus 论坛 (http://forum.lazarus.freepascal.org/index.php?topic=4936.0):

运行时错误 5 表示访问被拒绝。该文件可能是只读的,而您 使用错误的(默认)文件模式,或者您尝试重新打开文件 一个新的文件句柄,而之前没有关闭它(在某处 while 和 repeat 循环可能你分配文件不止一次,然后 重置失败?)。

如果我现在没记错的话,创建的工作流程应该如下:

AssignFile(f, filename); Rewrite(f); CloseFile(f);

对于现有文件:

AssignFile(f, filename); Reset(f); CloseFile(f);

通过 cmets 中的问题看到您的代码中发现的其他错误,我强烈建议您投入更多时间进行调试,当此类错误发生时 - 删除所有不相关的代码并检查您的代码设计是否存在上述情况(分配文件在创建它之前,等等)。

【讨论】:

  • 谢谢你的回答:)
  • 如果该答案对您有所帮助,您可以投票。如果它解决了您的问题 - 将其标记为已接受;)无论哪种方式,当您发现问题时请给我们留言!
  • 我不完全确定问题出在哪里。我认为它可能是 FileCreate(我在网上找到了它,所以我对这个过程没有经验,可能这是问题的一部分)。它似乎创建了一个无法立即读取的文件。在我的情况下,我能够使用 rewrite() 创建文件来解决这个问题。无论如何,感谢您的宝贵时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多