delphi 写日志文件I/O error 32

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi 写日志文件I/O error 32相关的知识,希望对你有一定的参考价值。

我写了一个函数用来写日志,但是写的时候提示出错。I/O error 32。我查了下错误原因应该是定时器同时写入的问题,然后我用了2中线程方法处理,但是都没用,结果一样,帮忙看下怎么回事。
procedure TEventLog.RecordLog(Log: string);
var
f:Textfile;
FileName:string;
name:string;
begin
if WaitForSingleObject(hMutex, INFINITE) = WAIT_OBJECT_0 then
begin
name:=FormatDateTime('yyyymmdd',now);
FileName:=ExtractFilePath(Paramstr(0))+'log\'+name+'.log'; //保存文件名
AssignFile(f, FileName);
try
if FileExists(FileName)= False then
Rewrite(f)
else
Append(f);
Writeln(f,FormatDateTime('yy''-''mm''-''dd hh:nn:ss ',Now) + Log);
finally
CloseFile(f);
end;
ReleaseMutex(hMutex);
end;
end;

procedure TEventLog.RecordLog(Log: string);
var
f:Textfile;
FileName:string;
name:string;
begin
criticalsection.enter;
try
name:=FormatDateTime('yyyymmdd',now);
FileName:=ExtractFilePath(Paramstr(0))+'log\'+name+'.log'; //保存文件名
AssignFile(f, FileName);
try
if FileExists(FileName)= False then
Rewrite(f)
else
Append(f);
Writeln(f,FormatDateTime('yy''-''mm''-''dd hh:nn:ss ',Now) + Log);
finally
CloseFile(f);
end;
finally
criticalsection.leave;
end;
end;

出错原因:因为访问文件的方式是独占式,两个地方同时访问了这个文件。

将 Textfile 设置为全局变量,程序初始化时,载入Textfile,将所有写Textfile 文件的操作,都由一个函数来执行,程序关闭时才CloseFile(Textfile) 。

追加文件内容速度很快,但是载入文件和关闭文件是非常缓慢的,这两过程所消耗的时间非常巨大的。一直载入/关闭的话,一点效率也没有。小文件还行,只要上M就可以明显感觉出来了。
参考技术A 注意一下线程同步!

MySQL主从同步是怎样实现的?

从库生成两个线程,一个I/O线程,一个SQL线程;
 
i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
 
SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致。

详细实现过程:

http://quliren.blog.51cto.com/9849266/1899877

以上是关于delphi 写日志文件I/O error 32的主要内容,如果未能解决你的问题,请参考以下文章

Linux磁盘I/O子系统

硬盘出现“Disk I/O error”错误

I/O error on GET request for,PKIX path building failed,,unable to find valid certification path

在 Python 中等待 Windows 文件 I/O 完成

主从复制报错Fatal error:The slave I/O thread stops because master and slave have equal MySQL server UUIDs;

i/o流通道被关闭写数据异常