0

我正在使用免费帕斯卡中的文件,我正在尝试打开一个文件,但如果它不存在,那么我会创建它。

这是我的代码:

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
4

2 回答 2

1

The code is a bit atypical, but Windows is known to keep fleeting locks on files for a few seconds even after they are closed and Dos originating code like this might suffer from that.

Maybe using FPC's FileExist() directly works better (IIRC on windows it is findfirst based, and not createfile based)

于 2013-11-06T19:23:46.203 回答
1

您是否使用您发布的确切代码重现了此错误,我真的看不到它导致您遇到的错误。我无法重现它,并且由于您没有包含使用 SysUtils,您应该得到运行时错误 5 而不是 EInOutError。

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

于 2013-11-05T08:26:22.150 回答