我正在处理免费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
答案 0 :(得分:1)
您是否使用您发布的确切代码重现了此错误,我实在看不到它导致您收到的错误。我无法重现它,因为你没有包含使用SysUtils你应该得到运行时错误5而不是EInOutError。
你的代码非常错误的一件事是你在打开/创建文件后没有关闭文件(尽管操作系统通常在程序完成后清理它)。鉴于此以及您获得EInOutError而不是运行时错误5这一事实我相信您的(真实的,更大的)程序在创建文件并稍后尝试打开后保持文件打开,但由于文件已经打开而失败。第二次运行程序时,文件已经创建,因此只打开一次(用于读取)。
答案 1 :(得分:1)
代码有点不典型,但是知道Windows会在文件关闭后对文件进行短暂的锁定几秒钟,并且Dos这样的代码可能会受此影响。
也许使用FPC的FileExist()直接工作得更好(在Windows上的IIRC是基于findfirst,而不是基于createfile)