if (文件存在) and (文件已经打开) then
Close(文件)请问以上代码该如何写,关键是判断(文件已经打开).
另外,我在程序里打开一个文本文件a,然后再新建一个文本文件b
接着关闭a时程序报错。closefile(a),"i/o 103 error"
文件以reset方式或者append方式打开都会有此异常~~

解决方案 »

  1.   

    var
      F:TextFile;
    begin
      if FileExists(FileName)  then
      begin
        AssignFile(F,FileName);
        try
         //如果文件已经打开的话就产生异常
         CloseFile(F);
        Except
        end;
      end;
    end;
      

  2.   

    wycg_cnh20(华 华) 
    我就是想把(如果文件打开)这行代码写出来啊
      

  3.   

    closefile(F) 是断开“变量”与文件的连接,无需做判断。
      

  4.   

    YestDay:=FormatDateTime('yyyymmdd',Yesterday);
      Today:=FormatDateTime('yyyymmdd',now);
      FileDir:=ExtractFilePath(Application.ExeName);
      SvrTime:=DateTimeToStr(Now);
      Memo.Lines.Add(SvrTime+' 正在初始化日志...');
      AssignFile(LogFile,FileDir+'logs\'+'!eRror'+YestDay+'.log');  If FileExists(FileDir+'logs\'+'!eRror'+YestDay+'.log') and (该文件正被使用) Then  //这里要怎么写???   //关闭前一天的已经打开的日志文件
          Begin
           Try
             CloseFile(LogFile);
           Except
             ;
           End;
         End;
      AssignFile(LogFile,FileDir+'logs\'+'!eRror'+Today+'.log');
      Try
      If Not FileExists(FileDir+Today+'logs\'+'.log') Then   
    //新建或者打开当天的日志文件
        ReWrite(LogFile)
      Else
        Reset(LogFile);  writeln(LogFile,'something');
      Flush(LogFile);
      Except
        Messagedlg('初始化日志文件失败!',mtError,[mbok],0);
        SvrTime:=DateTimeToStr(Now);
        Memo.Lines.Add(SvrTime+' 失败!');
        Screen.Cursor:=crArrow;
        Btbtn_Lstn.Enabled:=True;
        Btbtn_Ext.Enabled:=True;
        Exit;
      End;procedure TFrm_Main.Button1Click(Sender: TObject); //当系统时间到了新的一天时,执行该过程
    Var FileDir,        //文件目录
        Today:String;   //程序运行的当天日期
    begin
      Today:=FormatDateTime('yyyymmdd',now);
      FileDir:=ExtractFilePath(Application.ExeName);
      AssignFile(LogFile,FileDir+'logs\'+'!eRror'+Today+'.log');
      If Not FileExists(FileDir+'logs\'+'!eRror'+Today+'.log')  Then
      Try
           ReWrite(LogFile);
     Except
        Messagedlg('初始化日志文件失败!',mtError,[mbok],0);
        SvrTime:=DateTimeToStr(Now);
        Memo.Lines.Add(SvrTime+' 失败!');
        Exit;
      End;
    end;//在上面的TFrm_Main.Button1Click执行完以后,尝试关闭前一天的日志文件
    procedure TFrm_Main.Button7Click(Sender: TObject);
    Var FileDir,        //文件目录
        YestDay,        //程序运行的前一天
    begin
      YestDay:=FormatDateTime('yyyymmdd',Yesterday);
      FileDir:=ExtractFilePath(Application.ExeName);
      AssignFile(LogFile,FileDir+'logs\'+'!eRror'+YestDay+'.log');
      If (FileExists(FileDir+'logs\'+'!eRror'+YestDay+'.log')) then
         Begin
           Try
             CloseFile(LogFile);   //在这里会抛出异常"i/o 103 error"
             SvrTime:=DateTimeToStr(Now);
             Memo.Lines.Add(SvrTime+' 日志文件已更新!');
           Except
             Messagedlg('error',mtError,[mbok],0);
           End;
         End;
    end;
      

  5.   

    简单的日志写法:procedure UP_WrLog(str:string);
    var
        Today:Tdatetime;
        y:word;
        m:word;
        d:word;
        filename:string;
        f:Textfile;
    begin
        Today:=date;
        decodedate(Today,y,m,d);
        filename:=inttostr(y)+'-'+inttostr(m)+'-'+inttostr(d)+'.log';
        Assignfile(f,filename);
        try
          if fileexists(filename)=false then
            begin
              Rewrite(f);
            end;
            Append(f);
            Writeln(f,str);
        finally
          Closefile(f);
        end;end;
      

  6.   

    FileClose方法我也试过了.
    关闭了已经打开的前一个文件后,不报错,但是文件实际上仍然没被关闭.
    比如我对该文件写一些信息,然后保存,则会出现问题~
      

  7.   

    不用判断是否打开,不管打没打开都先CLOSE掉。
      

  8.   

    liuqifeiyu(liuqi) 
    那会直接触发异常 "i/o 103 error"
      

  9.   

    //如何判断文件已经被打开
    //参考如下代码function IsFileInUse(fName : string ) : boolean; 
    var 
     HFileRes : HFILE; 
    begin 
     Result := false; 
     if not FileExists(fName) then exit; 
     HFileRes:=CreateFile(pchar(fName),GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
     Result:=(HFileRes=INVALID_HANDLE_VALUE); 
     if not Result then CloseHandle(HFileRes); 
    end; procedure TForm1.Button1Click(Sender: TObject); 
    begin 
     if isfFileInUse('c:\programs\delphi5\bin\delphi32.exe') then 
      ShowMessage('File in use')
     else 
      ShowMessage('File not in use'); 
    end;
      

  10.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        ListView1: TListView;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      s: String;
      i:Integer;
      List: TStringList;
      TempListItem:TListItem;
    begin
      List := TStringList.Create;
      List.LoadFromFile('test.txt');
      for i := 0 to List.Count - 1 do
      begin
        S := List[i];
        TempListItem:=self.ListView1.Items.Add;
        TempListItem.Caption:=S;
      end;
      List.Free;
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    var
        TempListColumn:TListColumn;
    begin
        self.ListView1.ViewStyle:=vsReport;
        TempListColumn:=self.ListView1.Columns.Add;
        TempListColumn.Caption:='逐行显示文本';
        TempListColumn.AutoSize:=true;
    end;end.