运行时错误没有明显原因

时间:2013-11-05 00:12:40

标签: file-io runtime-error freepascal

我正在处理免费pascal中的文件而我正在尝试打开文件,但如果它不存在则我会创建它。

这是我的代码:

program messages;

const PATH_ = 'data/messages/';

type messageFields = 
        record
            date : String
          ; viewed : Boolean
          ; text : String
          ; sender : String [ 8 ]
      end
  ; messagesFile = file of messageFields 
  ;

procedure openMessagesFile ( var _file: messagesFile; _fileName: String; var error: Boolean );
  begin
    error := false;
    assign ( _file, PATH_+_fileName );
    {$I-}
    reset ( _file );
    {$I+}   
    if ( ioResult <> 0 ) then
      error := true;
  end;

var _file: messagesFile
  ; fileName: String
  ; error: boolean;
begin
  readln(filename);
  openMessageFile(_file, filename, error);
  if ( error ) then
    rewrite(_file);
end.

我第一次执行程序时,因为文件不存在,所以抛出异常。 第二次,工作正常!

这是一个例外:

An unhandled exception occurred at $00401759 :
EInOutError : Access denied

2 个答案:

答案 0 :(得分:1)

您是否使用您发布的确切代码重现了此错误,我实在看不到它导致您收到的错误。我无法重现它,因为你没有包含使用SysUtils你应该得到运行时错误5而不是EInOutError。

你的代码非常错误的一件事是你在打开/创建文件后没有关闭文件(尽管操作系统通常在程序完成后清理它)。鉴于此以及您获得EInOutError而不是运行时错误5这一事实我相信您的(真实的,更大的)程序在创建文件并稍后尝试打开后保持文件打开,但由于文件已经打开而失败。第二次运行程序时,文件已经创建,因此只打开一次(用于读取)。

答案 1 :(得分:1)

代码有点不典型,但是知道Windows会在文件关闭后对文件进行短暂的锁定几秒钟,并且Dos这样的代码可能会受此影响。

也许使用FPC的FileExist()直接工作得更好(在Windows上的IIRC是基于findfirst,而不是基于createfile)