如何将操作记录逐行写到程序目录下的TXT文件中,下次写入进接着上次的行数进行写入

解决方案 »

  1.   

    你每次写入的文本多吗?
    如果很多。建议还是每次创建一个TXT,按当时的精确时间来命名。。代码参考以下:
    procedure TMain_F.BtnGetFptStrClick(Sender: TObject);
    var
      I : Integer;
      J : Integer;
      LEN : Integer;  JH : String;  BH: WideString;
      XM: WideString;
      BM: String;
      PSD: WideString;
      UPower: WideString;
      UEnabled: WideString;  FptStr : WideString;  UPower1 : Integer;
      UEnabled1: WordBool;
      F: TFileStream;
      S: string;
      UserInfoFileName : string;
    begin
      mmo1.Lines.Add(GetDateTimeToStr_A() + '正在获取考勤机的指纹模板,请稍候... ...');
      mmo1.Lines.Add(GetDateTimeToStr_A() + '如果下载速度太慢,请调整 ''  高级设置 '' 页相关参数。');
      ConnectionToDev;
      IF C then
      begin
        JH := RightStr('0' + IntToStr(qryDevicInfoDeviceID.Value),2);
        //保存到 txt 文件中
        if not DirectoryExists(ExtractFilePath(paramStr(0)) + 'UserInfo') then
        begin
          CreateDir(ExtractFilePath(paramStr(0)) + 'UserInfo');
        end;
        UserInfoFileName := ExtractFilePath(paramStr(0)) + 'UserInfo\' + JH + '_' + GetDateTimeToStr() + '.txt';
        F:=TFileStream.Create(UserInfoFileName, fmOpenWrite or fmCreate);    LEN := 2048;
        if CZKEM1.ReadAllUserID(Dev_ID) then
        begin
          I := 1;
          JH := IntToStr(qryDevicInfoDeviceID.Value);
          while CZKEM1.SSR_GetAllUserInfo(Dev_ID, BH, XM, PSD,UPower1, UEnabled1) do
          begin
            //补充YSKQ需要的信息
            qryEmp.Close;
            qryEmp.SQL.Text := 'select rtrim(isnull(xm,'''')),rtrim(isnull(bm,'''')) from employee where bh=' + BH;
            try
              qryEmp.Open;
              if qryEmp.RecordCount = 1 then
              begin
                XM := qryEmp.Fields[0].Value;
                BM := qryEmp.Fields[1].Value;
              end else
              begin
                XM := '';
                BM := '';
              end;
            except
            end;        if UPower1 = 0 then
            begin
              UPower := '普通';
            end else
            begin
              UPower := '管理';
            end;        if UEnabled1 then
            begin
              UEnabled := '有效';
            end else
            begin
              UEnabled := '失效';
            end;        //填入到GridUserInfo
            GridUserInfo.RowCount := I + 1;
            GridUserInfo.Cells[0,I] := IntToStr(I);
            GridUserInfo.Cells[1,I] := BH;
            GridUserInfo.Cells[2,I] := WideCharToString(PWideChar(XM));
            GridUserInfo.Cells[3,I] := BM;
            GridUserInfo.Cells[4,I] := PSD;
            GridUserInfo.Cells[5,I] := UPower;
            GridUserInfo.Cells[6,I] := UEnabled;        GridUserInfo.Row := I;        //获取指纹模板
            for J :=0 to StrToInt(se2.Text)-1 do
            begin
              CZKEM1.SSR_GetUserTmpStr(Dev_ID,BH,J,FptStr,LEN);
              GridUserInfo.Cells[7+J,I] := FptStr;
            end;
            //写入文本文件
            S :=
              JH + #9 +
              BH + #9 +
              GridUserInfo.Cells[2,I] + #9 +
              GridUserInfo.Cells[3,I] + #9 +
              GridUserInfo.Cells[4,I] + #9 +
              GridUserInfo.Cells[5,I] + #9 +
              GridUserInfo.Cells[6,I] + #9 +
              GridUserInfo.Cells[7,I] + #9 +
              GridUserInfo.Cells[8,I] + #9 +
              GridUserInfo.Cells[9,I] + #9 +
              GridUserInfo.Cells[10,I] + #9 +
              GridUserInfo.Cells[11,I] + #9 +
              GridUserInfo.Cells[12,I] + #9 +
              GridUserInfo.Cells[13,I] + #9 +
              GridUserInfo.Cells[14,I] + #9 +
              GridUserInfo.Cells[15,I] + #9 +
              GridUserInfo.Cells[16,I] + #13#10;
            F.Write(S[1],Length(S));        //删除数据库表中该机号的该用户信息。
            cmdInsertUserInfo.CommandText := 'delete from FingerPrintUserInfo where DEV_ID=' + JH + ' AND BH=' + BH;
            cmdInsertUserInfo.Execute;
            //保存到数据库
            cmdInsertUserInfo.CommandText := 'INSERT INTO FingerPrintUserInfo values(' +
                                             JH + ',' +
                                             BH + ',' +
                                             '''' + GridUserInfo.Cells[2,I] + ''',' +
                                             '''' + GridUserInfo.Cells[3,I] + ''',' +
                                             '''' + GridUserInfo.Cells[4,I] + ''',' +
                                             '''' + GridUserInfo.Cells[5,I] + ''',' +
                                             '''' + GridUserInfo.Cells[6,I] + ''',' +
                                             '''' + GridUserInfo.Cells[7,I] + ''',' +
                                             '''' + GridUserInfo.Cells[8,I] + ''',' +
                                             '''' + GridUserInfo.Cells[9,I] + ''',' +
                                             '''' + GridUserInfo.Cells[10,I] + ''',' +
                                             '''' + GridUserInfo.Cells[11,I] + ''',' +
                                             '''' + GridUserInfo.Cells[12,I] + ''',' +
                                             '''' + GridUserInfo.Cells[13,I] + ''',' +
                                             '''' + GridUserInfo.Cells[14,I] + ''',' +
                                             '''' + GridUserInfo.Cells[15,I] + ''',' +
                                             '''' + GridUserInfo.Cells[16,I] + ''')';
            cmdInsertUserInfo.Execute;
            Application.ProcessMessages;
            I := I + 1;
            XM := '';
            BM := '';
          end;
        end else
        begin
          I := 1;
        end;    IF I > 1 then
        begin
          mmo1.Lines.Add(GetDateTimeToStr_A() + '获取考勤机的用户信息及指纹模板成功!');
        end else
        begin
          mmo1.Lines.Add(GetDateTimeToStr_A() + '考勤机上没有任何用户信息!');
        end;    //断开连接
        DeConnectionToDev;
        F.Free;
      end else
      begin
        mmo1.Lines.Add(GetDateTimeToStr_A() + '连接考勤机失败!');
      end;
    end;
      

  2.   

    当然如果你不想操作流或者操作txt的话,可以利用TStringlist进行操作var
      list:TStringList;
    begin
      list := TStringList.Create;
      list.LoadFromFile();//从文件中读取
      ...                 //操作
      list.SaveToFile();  //保存到文件
       list.Free;
    end;
      

  3.   

    list.LoadFromFile();就是用流方式载入的。这个就可以。
    list.add();
      

  4.   

    //保存日志
    //日志内容为:接收数据时间+接收数据+返回数据+处理结果或者错误原因
    procedure TfrmMain.SaveLogToFile(sRec:string;sSend:string);
    var
      sList:TStringList;
      sDate:String;
      sFilePath:String;
      sFileName:String;
    begin
      try
        sList:=TStringList.Create;    //格式化文件名
        sDate:=FormatDateTime('yyyymmdd',Date());
        sFilePath:=ExtractFilePath(Application.ExeName)+'Log\';
        sFileName:=sFilePath+sDate+'.Log';    //日志文件不存在,先保存(即建立)文件
        if not FileExists(sFileName) then
        begin
          //加入时间标志
          sList.Add(DateToStr(Date())+'日志文件');
          sList.Append('-------------------------------------------------------------------------------------------');
          sList.Append(TimeToStr(Now())+':');
          sList.Append('Rec   :'+sRec);
          sList.Append('Send  :'+sSend);      //判断解包是否成功,保存不同的处理结果
          if bUnPackFlag then
            sList.Append('Result:'+sDBResult)
          else
            sList.Append('Result:'+sError);
             
          sList.Append('-------------------------------------------------------------------------------------------');
          sList.SaveToFile(sFileName);
        end
        else
        begin
          //日志文件存在,直接打开,添加数据
          sList.LoadFromFile(sFileName);
          sList.Append(TimeToStr(Now())+':');
          sList.Append('Rec   :'+sRec);
          sList.Append('Send  :'+sSend);      //解包是否成功
          if bUnPackFlag then
            //记录数据库返回信息
            sList.Append('Result:'+sDBResult)
          else
            //记录错误信息
            sList.Append('Result:'+sError);      sList.Append('-------------------------------------------------------------------------------------------');
          sList.SaveToFile(sFileName);
        end;
      finally
        FreeAndNil(sList);
      end;
    end;
    //---------------------------------------------------------------------------
      

  5.   


    procedure TMainForm.CalcEat(var Msg: TMessage);//統計訂餐員工明細
    var
      F:TextFile;
      strFile:String;
      i:Integer;
      ArrCount:Array[1..4] of Integer;
    begin
      for i:=1 to 4 do
        ArrCount[i]:=0;
      with AQuery do
      begin
        Close;
        SQL.Clear;
        SQL.Add(' Select b.EmployeNo,b.EmployeName,b.department,');
        SQL.Add('        a.BookingDate,a.InsertDateTime,a.Dining');
        SQL.Add(' From Booking a Left outer join ygjbzl b On a.EmployeNo=b.EmployeNo');
        SQL.Add(' Where a.BookingDate='''+NextDate+'''');
        SQL.Add(' Order by a.InsertDateTime');
        Open;
      end;
      strFile :=ExeFileDir+'\訂餐員工記錄統計\訂餐員工記錄'+curDate+'.txt';
      try
        AssignFile(F, strFile);
        Rewrite(F);
        Append(F);
        Writeln(F, curDate+'('+sWeek+')訂餐員工明細記錄如下:');
        Writeln(F, '員工編號    員工姓名    部門         訂餐日      刷卡時間              餐別');
        Writeln(F, '========    ========    ========     ========    ================      ======');
        with AQuery do
        begin
          First;
          While Not Eof do
          begin
            Writeln(F, Format('%-12s',[Trim(FieldByName('EmployeNo').AsString)])+
                       Format('%-12s',[Trim(FieldByName('EmployeName').AsString)])+
                       Format('%-13s',[Trim(FieldByName('department').AsString)])+
                       Format('%-12s',[Trim(FieldByName('BookingDate').AsString)])+
                       Format('%-22s',[Trim(FieldByName('InsertDateTime').AsString)])+
                       Format('%-8s',[Trim(ConvertToValue(FieldByName('Dining').AsInteger))]));
            Inc(ArrCount[FieldByName('Dining').AsInteger]);
            Next;
          end;
        end;
        Writeln(F, '-----------------------------------------------------------------------------');
          if ArrCount[1]<>0 then
            Writeln(F, '特別早餐共:'+IntToStr(ArrCount[1])+'人');
          if ArrCount[2]<>0 then
            Write(F, '早餐共:'+IntToStr(ArrCount[2])+'人    ');
          if ArrCount[3]<>0 then
            Write(F, '中餐共:'+IntToStr(ArrCount[3])+'人    ');
          if ArrCount[4]<>0 then
            Write(F, '晚餐共:'+IntToStr(ArrCount[4])+'人');
        Flush(F);
        CloseFile(F);
      except
        ShowMessage(Exception(ExceptObject).Message);
      end;
      

  6.   

    你可以用TSringList载入,然后再最后一行再添加,首先loadformfile,然后savetofile,这样可以保证这样个规律,很简单
      

  7.   

    简单点,直接写,就是操作文本文件
    var
      f:textfile;
      strfile:string;
    begin
      strfile := ExtractFilePath(ParamStr(0)+'aa.txt';
      AssignFile(f,strfile);
      Rewrite(f);
      Writeln(f,'操作记录内容字符串');
      CloseFile(f);
    end;
      

  8.   

    接楼上的,继续追加记录应该不是ReWrite(f),而是Append(f)吧
      

  9.   

    恩,是append,没留意
    :)
      

  10.   

    高吞吐量的一个日志函数类(Delphi)
    完全你满足你的要求,关键是性能还很好,可以快速写入
    http://blog.csdn.net/lwm08106542000/article/details/6585425
      

  11.   

    //Tstringlist格式的txt文件的读写(成功返回最后的行数,失败返回-1)
    function StrRWTxt(fName:string;var strlst:TstringList;RW:string='R'):integer;
    begin
      if LowerCase(RW)='w' then   //存
      begin
        try
          strlst.SaveToFile(fName);
          result:= strlst.count;
        except
          result:=-1;
        end;
      end
      else                        //读
      begin
        strlst.Clear;
        try
          if fileexists(fName)=false then result:=-1
          else
          begin
            strlst.LoadFromFile(fName);
            result:= strlst.count;
          end;
        except
          result:=-1;
        end;
      end;
    end;