大虾帮看一下是什么问题?
代码已测试,小的文件夹或一般的都可以打包,但有的不行.需求是:要将一个文件夹下的所有文件打包成一个文件。问题:
1.为什么打包小点的文件夹,则不会出错,但当大于一两百M的文件时,就会出现:access violation 的问题?如何改?
2.当打包大点的文件夹时,速度很慢,如何改进代码?
3.有的类型文件不能打包,比如.mp3文件(文件名是中文而且不太规则),一压就会出现access violation的错?下面是关键代码,高人帮看一下,如何改进代码?到底哪出错了?
谢了。var
    findex:TFileindex;
    mainfile:TFileStream;
    addfile:TMemoryStream;
{--------将索引写到流中---------}
procedure writefileindex(var astream:TFileStream;finfo:TFileindex);
begin
    astream.Seek(0,soFromEnd ); //移动指针到流末尾
    astream.WriteBuffer(finfo,SizeOf(finfo)); //写入索引信息
    astream.WriteBuffer(er,5); //添加标识,表明以有文件被合并
end;{-----------合并文件夹-------------}
procedure CompressFolder(ts1:TStringList;SourceDir:String);//ts的格式是,里面存的全是文件的绝对路径
var  i:Integer;
  l,p:Int64;
  
begin    ToDir:=copy(SourceDir,0,RightPosEx('\',SourceDir)-1);
    ToFile:=ToDir+ copy(SourceDir,RightPosEx('\',SourceDir),length(SourceDir)-RightPosEx('\',SourceDir)+1)+'.cde';    
       
    {-----开始写-----}
    FillChar(findex,SizeOf(findex ),0);
    mainfile:= TFileStream.Create(ToFile,fmCreate +fmOpenRead);
    addfile:= TMemoryStream.Create;
    try 
      addfile.LoadFromFile(ts1.Strings[0]);
      l:=mainfile.CopyFrom(addfile,addfile.Size );//载入主文件 ,并记录拷入主文件长度
      p:=0;
      {-----初始主文件索引----}
      findex.count := 1;
      findex.index[0].name := ExtractFileName(ts1.Strings[0]) ;
      findex.index[0].position := p;
      findex.index[0].size := l;
      findex.index[0].Path:=ts1.Strings[0];
      p:= p + l;
      {------循环拷入要合并文件------}
      for i := 1 to ts1.Count-1 do
        try
        addfile.LoadFromFile(ts1.Strings[i]);
        addfile.Seek(0,soFromBeginning );
        l := mainfile.CopyFrom(addfile,addfile.Size );//拷入第i个合并文件
        findex.index[i].name := ExtractFileName(ts1.Strings[i]);
        findex.index[i].position :=p;
        findex.index[i].Path:=ts1.Strings[i];
        findex.index[i].size := l;
        Inc(findex.count);
        p:= p + l;
        except
         // ShowMessage('Error :'+ts1.Strings[i]); 
        end; 
        writefileindex(mainfile,findex);//添加索引
     
    finally   //释放资源
      mainfile.Free;
      addfile.Free;
    end;end;