我现在要把一个很大的文件,里面有几十天的数据,把这个文件分成一天一个小文件。就是把一天的数据放在一起,形成一个文件,一天一个小文件。(每次都要在文件最后面追加数据,而不能把前面的数据覆盖)。注意:一天的数据不一定是连在一起的,可能今天数据后面是昨天的数据,然后后面又是今天的数据,没有规律。一帧数据是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;
代码:
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;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货