服务器端;对客户机器上一个目录新建一个文件(当该目录没有文件时)的程序
客户端;有个程序也是对该文件进行读取并把内容显示出来。
现在客户端发生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;

解决方案 »

  1.   

    在客户环境有时候会发生IO异常错误,在我们开发时候经过测试了,上边代码没有问题的,
    另外说明一下:已经做了排他处理(LOCK处理)
      

  2.   

      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;
    ---------------------
    ReWrite(F); 这个是新建文件呀!
      

  3.   

    var   F:   TextFile; begin 
        AssignFile(F,   'NEWFILE.$$$ '); 
        Rewrite(F); 
        Writeln(F,   'Just   created   file   with   this   text   in   it... '); 
        CloseFile(F); 
    end;
    --------------
    用法。
      

  4.   

    我查询了资料Rewrite是先将存在文件的内容清空,再以新建文件的形式创建这个文件,Reset是只读方式打开文件的,
     我猜想存在的文件是只读属性的,所以发生错误。
    但是在客户端运行的生成数据文件的程序(C程序生成的EXE)中是以Append形式写入数据文件的,
    请问这种情况下另一个程序(Delphi)读取这个数据文件,会不会发生权限之类的问题呢?
      

  5.   

    1.原先这个错误报的是EInOutError(Win32Error)错误 【ErrorCode'1224请求的操作无法在用户映射区域打开的文件上执行】
    2.然后我再程序上做了以下修改
      在出错时候朴捉异常然后再将其抛出。
     在运行程序的时候就变成了【ErrorCode 32 另一个程序正在使用此文件,进程无法访问】
    3.我们分析有可能是杀毒软件正在检查所操作的文件时候出错的。但是又觉得不是这样的,这个错误时而有时而没有。
    不知道改怎么办!
    急!急!急!谁能提供解决的方法和思路呢?
      

  6.   

      LogFileLock.Enter ;
      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 ;
    上面的代码使用正常。
    你比较一下
      

  7.   

    {$I-}
      AssignFile
      ReWrite
      Append
      Writeln
      CloseFile
    {$I+}用编译指令屏蔽I/O错误,不过只是不报而已
      

  8.   

    TO:zzlingaaa 
    用你的方法加上{$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 另一个程序正在使用,不能访问】并且还有【地址冲突】的错误呢?