服务器端;对客户机器上一个目录新建一个文件(当该目录没有文件时)的程序
客户端;有个程序也是对该文件进行读取并把内容显示出来。
现在客户端发生IO错误,客户端大致代码如下;
----------------------
F:TextFile;
S:string;
memor1:Tmemo;
-----------------------
FromCreat()
if FileExists(FileName) then
memor1.Lines.LoadFromFile(FileName);
AssignFile(F,FileName);
ReWrite(F);
CloseFile(F);
DeleteFIle(FileName);
end;
---------------------------
ReRead()【时间触发】
if FileExists(FileName) then
AssignFile(F,FileName);
Reset(F);
memor1.Lines.BeginUpdate
While not EOF(F) do
begin
Readln(F,S);
memor1.Lines.Add(S);
end;
memor1.Lines.EndUpdate;
ReWrite(F);
CloseFile(F);
DeleteFIle(FileName);
end;
客户端;有个程序也是对该文件进行读取并把内容显示出来。
现在客户端发生IO错误,客户端大致代码如下;
----------------------
F:TextFile;
S:string;
memor1:Tmemo;
-----------------------
FromCreat()
if FileExists(FileName) then
memor1.Lines.LoadFromFile(FileName);
AssignFile(F,FileName);
ReWrite(F);
CloseFile(F);
DeleteFIle(FileName);
end;
---------------------------
ReRead()【时间触发】
if FileExists(FileName) then
AssignFile(F,FileName);
Reset(F);
memor1.Lines.BeginUpdate
While not EOF(F) do
begin
Readln(F,S);
memor1.Lines.Add(S);
end;
memor1.Lines.EndUpdate;
ReWrite(F);
CloseFile(F);
DeleteFIle(FileName);
end;
另外说明一下:已经做了排他处理(LOCK处理)
AssignFile(F,FileName);
Reset(F);
memor1.Lines.BeginUpdate
While not EOF(F) do
begin
Readln(F,S);
memor1.Lines.Add(S);
end;
memor1.Lines.EndUpdate;
ReWrite(F);
CloseFile(F);
DeleteFIle(FileName);
end;
---------------------
ReWrite(F); 这个是新建文件呀!
AssignFile(F, 'NEWFILE.$$$ ');
Rewrite(F);
Writeln(F, 'Just created file with this text in it... ');
CloseFile(F);
end;
--------------
用法。
我猜想存在的文件是只读属性的,所以发生错误。
但是在客户端运行的生成数据文件的程序(C程序生成的EXE)中是以Append形式写入数据文件的,
请问这种情况下另一个程序(Delphi)读取这个数据文件,会不会发生权限之类的问题呢?
2.然后我再程序上做了以下修改
在出错时候朴捉异常然后再将其抛出。
在运行程序的时候就变成了【ErrorCode 32 另一个程序正在使用此文件,进程无法访问】
3.我们分析有可能是杀毒软件正在检查所操作的文件时候出错的。但是又觉得不是这样的,这个错误时而有时而没有。
不知道改怎么办!
急!急!急!谁能提供解决的方法和思路呢?
try
if not FileExists(FLogFileName) then
begin
AssignFile(f, FLogFileName);
rewrite(f);
end
else
begin
AssignFile(f, FLogFileName);
Reset(f);
if FileSize(f) > 2048 then
begin
CloseFile(f);
fName := ExtractFilePath(ParamStr(0)) +'log\'+ FormatDateTime('yyyymmddhhnn', Now) + '.log' ;
CopyFile(PChar(FLogFileName), PChar(fName), false) ;
AssignFile(f, FLogFileName);
try
Rewrite(f);
except
CloseFile(f) ;
// Assert(false, 'rewrite log fail.');
exit ;
end ;
end
else
Append(f);
end;
WriteLn(f, info);
CloseFile(f);
finally
LogFileLock.Leave ;
end ;
上面的代码使用正常。
你比较一下
AssignFile
ReWrite
Append
Writeln
CloseFile
{$I+}用编译指令屏蔽I/O错误,不过只是不报而已
用你的方法加上{$I-} ,比如在更改只读文件的时候怎么系统还是报103的错误啊? 而且下一条打Log的语句不执行啊?
另外问一个问题;
在使用Rewrite(f);的时候,如果对应文件是只读属性的,那么在TryExcetion 处理的Excetion里用E.ErrorCode输出的时候,结果得到【ErrorCode=5 拒绝访问】 但是改换成GetLastError的时候 结果却是【1413无效索引】经过询问知道下面的情况,能在这里解释一下吗?
如果是调用API,可以使用GetLastError()获得错误信息。
如果是调用Delphi的函数和对象,一般采用try...except机制,我觉得这里用try...except机制,但是以前客户运行结果是【出现系统错误1224 请求操作无法再使用用户映射区域打开的文件上执行】,采用try...except(E.Errorcode)机制把扑的错误,打个LOG在Raise出去,怎么得到的却是【32 另一个程序正在使用,不能访问】并且还有【地址冲突】的错误呢?