我现在要把一个很大的文件,里面有几十天的数据,把这个文件分成一天一个小文件。就是把一天的数据放在一起,形成一个文件,一天一个小文件。(每次都要在文件最后面追加数据,而不能把前面的数据覆盖)。注意:一天的数据不一定是连在一起的,可能今天数据后面是昨天的数据,然后后面又是今天的数据,没有规律。一帧数据是32个字节,每一帧数据里都有日期。我的代码如下。但总是会出问题说“另一个程序正在使用此文件,进程无法访问”。请问各位大虾这是为什么。谢谢!!!
代码:
procedure TFrm_TCNEvent.SpeedButton_FileChaiClick(Sender: TObject);
var
  OldFileHandle: Integer;//原文件的句柄
  i,j,FileSize,RecCount:integer;
  NewFileStream: TFileStream;//文件流
  FrameBuf:array[0..31] of byte;//每一帧的全部数据,32个字节
  time_begin_pre:TDateTime;
  ExtractName:string;//无路径名称
  NewFileName:string;
  OldFileNameStr:string;//绝对路径名称  DateSL:TStringList;//日期列表
  CreateFileHandle: Integer;//创建空文件的句柄
begin
  Frm_Tcnevent.OpenDialog1.InitialDir :=ExtractFilePath(ParamStr(0))+'DataFiles\TCN';
  if Frm_Tcnevent.opendialog1.Execute then
  begin
    OldFileNameStr:=Frm_Tcnevent.opendialog1.FileName;    ExtractName:=ExtractFileName(Frm_Tcnevent.opendialog1.FileName);//无路径名称
    vehiclenoStr:=copy(ExtractName,1,pos('_',ExtractName)-1);;//车号
    OldFileHandle:=FileOpen(Frm_Tcnevent.opendialog1.FileName,fmOpenRead);
    FileSize:=getfilesize(OldFileHandle,nil);
    RecCount:=FileSize div 32;    self.ProBar1.Min:=0; //进度条
    self.ProBar1.Max:=2*RecCount;
    self.ProBar1.Position:=0;
    self.ProBar1.Step:=1;
    Frm_TCNEvent.StatusBar.Panels[1].Text:='拆分文件是把每一天的数据分出来形成一个文件';
    Frm_TCNEvent.StatusBar.Panels[0].Text:='正在拆分文件...';
    
    //第一次打开文件,遍历所有日期,创建空的文件
    DateSL:=TStringList.Create; //日期列表
    for i := 0 to RecCount-1 do
    begin
       FileRead(OldFileHandle,FrameBuf,sizeof(FrameBuf));//一次读一帧数据       time_begin_Pre:=inttostr(2000+FrameBuf[7])+'-'+inttostr(FrameBuf[6])+'-'+inttostr(FrameBuf[5]);//日期
       if -1=DateSl.IndexOf(time_begin_Pre) then//日期列表中没有,则存入列表,并创建空文件
       begin
         DateSL.Add(time_begin_Pre);
         NewFileName:=ExtractFilePath(ParamStr(0))+'DataFiles\TCN\'+
           vehiclenoStr+'_EVENT'+time_begin_Pre+'.dat';
         if FileExists(NewFileName) then  DeleteFile(NewFileName);         CreateFileHandle:=FileCreate(NewFileName);//创建空的文件
         FileClose(CreateFileHandle);
       end;       Application.ProcessMessages;
       self.ProBar1.StepIt;
    end;
    FileClose(OldFileHandle); //在这里关闭,这里要关闭文件句柄 
    DateSL.Free;
    //第一次打开文件,遍历所有日期,创建空的文件    //重新打开文件,把每一天的数据放在一起
    OldFileHandle:=FileOpen(Frm_Tcnevent.opendialog1.FileName,fmOpenRead);
    for i := 0 to RecCount-1 do
    begin
       FileRead(OldFileHandle,FrameBuf,sizeof(FrameBuf));//一次读一帧数据       time_begin_Pre:=inttostr(2000+FrameBuf[7])+'-'+inttostr(FrameBuf[6])+'-'+inttostr(FrameBuf[5]);
       NewFileName:=ExtractFilePath(ParamStr(0))+'DataFiles\TCN\'+
           vehiclenoStr+'_EVENT'+time_begin_Pre+'.dat';//日期       NewFileStream:=TFileStream.Create(NewFileName,fmOpenWrite or fmShareDenyNone);
       NewFileStream.Position:=NewFileStream.Size;//从文件后面追加数据
       try
         NewFileStream.WriteBuffer(FrameBuf,sizeof(FrameBuf));//一次写入一帧数据
       finally
         NewFileStream.Free;//关闭流
       end;       Application.ProcessMessages;
       self.ProBar1.StepIt;
    end;
    FileClose(OldFileHandle); //在这里关闭,这里要关闭文件句柄
    //重新打开文件,把每一天的数据放在一起
    self.ProBar1.Position:=self.ProBar1.Max;
    Frm_TCNEvent.StatusBar.Panels[0].Text:='拆分文件完毕';
    Frm_TCNEvent.StatusBar.Panels[1].Text:='拆分后的文件位于DataFiles\TCN,一天一个文件';  end;
end;