我看了一段将一个文件加在另一个文件的结尾并将它读出的例子:见下面的示例:
function Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;
var
    Target,Source:TFileStream;
    MyFileSize:integer;
begin
try
    Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareExclusive);
    Target:=TFileStream.Create(TargetFile,fmOpenWrite or fmShareExclusive);
    try
        Target.Seek(0,soFromEnd);
        Target.CopyFrom(Source,0);
        MyFileSize:=Source.Size + Sizeof(MyFileSize);
        Target.WriteBuffer(MyFileSize,Sizeof(MyFileSize));
    finally
        Target.Free;
        Source.Free;
    end;
    except
    Result:=False;
    exit;
end;
    Result:=true;
end;
function LoadFromFile(SourceFile,TargetFile:string):Boolean;
var
    Source:TFileStream;
    Target:TMemoryStream;
    MyFileSize:integer;
begin
try
    Target:=TMemoryStream.Create;
    Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareDenyNone);
    try
        Source.Seek(-sizeof(MyFileSize),soFromEnd);
        Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));
        Source.seek(-MyFileSize,soFromEnd);
        Target.CopyFrom(Source,MyFileSize-sizeof(MyFileSize));
        Target.SaveToFile(TargetFile);
    finally
        Target.Free;
        Source.Free;
    end;
    except
    Result:=False;
    exit;
end;
    Result:=true;
end;     
如果加多个文件的话,我读出操作是如下:FileNum是文件数(加了几个文件):
Source.Seek(0,soFromEnd);
for i:=1 to FileNum
begin
  Source.Seek(-sizeof(MyFileSize),soFromCurrent);
  Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));
  Source.seek(-(MyFileSize - sizeof(MyFileSize)),soFromCurrent);
  Target.CopyFrom(Source,MyFileSize-sizeof(MyFileSize));
  Target.SaveToFile(TargetFile);//TargetFile已经在循环时赋值。
end;
读出后,好像有错误,读出的文件不能正常显示.不知代码错在什么地方.
指点一下,好吗?

解决方案 »

  1.   

    一个文件按示例这样读,
    Source.Seek(-sizeof(MyFileSize),soFromEnd);
    Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));
    Source.seek(-MyFileSize,soFromEnd);
    Target.CopyFrom(Source,MyFileSize-sizeof(MyFileSize));
    Target.SaveToFile(TargetFile);多个文件的话:我按如下读,可读出的文件,无法打开,就错在这儿。Source.Seek(0,soFromEnd);
    for i:=1 to FileNum//FileNum是文件数(加了几个文件):
    begin
      Source.Seek(-sizeof(MyFileSize),soFromCurrent);
      Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));
      Source.seek(-(MyFileSize - sizeof(MyFileSize)),soFromCurrent);
      Target.CopyFrom(Source,MyFileSize-sizeof(MyFileSize));
      Target.SaveToFile(TargetFile);//TargetFile已经在循环时赋值。
    end;
      

  2.   

    我是在文件头定义了文件数量(word类型,两个字节),读出时首先读出前两个字节赋值给FileNum。
    如果FileNum=1
    使用下面代码读出的文件不可显示,是tif文件。
    Source.Seek(0,soFromEnd);
    for i:=1 to FileNum//FileNum是文件数(加了几个文件):
    begin
      Source.Seek(-sizeof(MyFileSize),soFromCurrent);
      Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));
      Source.seek(-(MyFileSize - sizeof(MyFileSize)),soFromCurrent);
      Target.CopyFrom(Source,MyFileSize-sizeof(MyFileSize));
      Target.SaveToFile(TargetFile);//TargetFile已经在循环时赋值。
    end;
    而使用示例的代码,读出后,tif可以显示出来:
    Source.Seek(0,soFromEnd);
    for i:=1 to FileNum//FileNum是文件数(加了几个文件):
    begin
      Source.Seek(-sizeof(MyFileSize),soFromEnd);
      Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));
      Source.seek(-MyFileSize,soFromEnd);
      Target.CopyFrom(Source,MyFileSize-sizeof(MyFileSize));
      Target.SaveToFile(TargetFile);//TargetFile已经在循环时赋值。
    end;
    我不知道错在什么地方,请您帮忙!!!
      

  3.   

    type
      PFileName = ^TFileName;
      TFileName = array [0..50] of Char;
      TFileData = record
        Name: TFileName;
        Size: Integer;
        Content: Pointer;
      end;procedure AppendFile(Dest: TStream; SourceFile: string);
    var
      Source: THandle;
      FileData: TFileData;
    begin
      Source := FileOpen(SourceFile, fmOpenRead);
      try
        FileData.Name := PFileName(ExtractFileName(SourceFile))^;
        FileData.Size := FileSeek(Source, 0, Ord(soEnd));
        GetMem(FileData.Content, FileData.Size);
        try
          FileSeek(Source, 0, Ord(soBeginning));
          if FileRead(Source, FileData.Content^, FileData.Size) <> FileData.Size then
            raise Exception.CreateFmt('Read %s file error', [SourceFile]);
          Dest.WriteBuffer(FileData, SizeOf(FileData) - SizeOf(Pointer));
          Dest.WriteBuffer(Filedata.Content^, FileData.Size);
        finally
          FreeMem(FileData.Content);
        end;
      finally
        CloseHandle(Source);
      end;
    end;procedure ExtractFile(SourceFile: string);  procedure SaveFile(Data: TFileData);
      begin
        with TMemoryStream.Create do
        try
          WriteBuffer(Data.Content^, Data.Size);
          SaveToFile(Data.Name);
        finally
          Free;
        end;
      end;var
      RetLen: Integer;
      FileData: TFileData;
    begin
      with TFileStream.Create(SourceFile, fmOpenRead) do
      try
        RetLen := Read(FileData, SizeOf(FileData) - SizeOf(Pointer));
        while RetLen > 0 do
        begin
          GetMem(FileData.Content, FileData.Size);
          try
            ReadBuffer(FileData.Content^, FileData.Size);
            SaveFile(FileData);
          finally
            FreeMem(FileData.Content);
          end;
          RetLen := Read(FileData, SizeOf(FileData) - SizeOf(Pointer));
        end;
      finally
        Free;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      I: Integer;
      DestStream: TFileStream;
    begin
      DestStream := TFileStream.Create('c:\temp\dest.dat', fmCreate);
      try
        if OpenDialog1.Execute then
          for I := 0 to OpenDialog1.Files.Count - 1 do
            AppendFile(DestStream, OpenDialog1.Files[I]);
      finally
        DestStream.Free;
      end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      ExtractFile('c:\temp\dest.dat');
    end;
      

  4.   

    copy_paste(木石三):
    谢谢给我这段代码,我现在真搞不懂不错在什么地方?
      

  5.   

    这一小段很简单的!帮我一下!
    Source.Seek(0,soFromEnd);
    for i:=1 to FileNum//FileNum是文件数(加了几个文件):
    begin
      Source.Seek(-sizeof(MyFileSize),soFromCurrent);
      Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));
      Source.seek(-(MyFileSize - sizeof(MyFileSize)),soFromCurrent);
      Target.CopyFrom(Source,MyFileSize-sizeof(MyFileSize));
      Target.SaveToFile(TargetFile);//TargetFile已经在循环时赋值。
    end;
      

  6.   

    看你的Cjt_AddtoFile
    你的结构应该是:  File content
      file size = file size + sizeof(4)我觉得不太对,因为一般来说是从文件开头读取,而你是从文件尾取size,而且加了个Sizeof(Integer),我不清楚你是为了什么?那读就是:
      ReadBuffer(FileSize, SizeOf(Integer));  //为什么不是-(FileSize-SizeOf(Integer))
      //因为前面那句话读了之后,文件指针又移动了Sizeof(integer)
      //而你所需要的的是定位到FileSize - SizeOf(integer),
      //所以两者得: - FileSize;
      Seek(-FileSize, soFromCurrent);  
      ...
      

  7.   

    我要将几个文件合并在一起,然后将它们分别读出来。
    写的时候,前两个字节放的是文件合并的数目,然后写入一个文件,再用四个字节写入这个文件的大小+4,以下依次这样操作。读出的时候,先读出前两个字节,看有几个文件合并,然后从文件结尾循环读出。我真不清楚这段代码错在什么地方?
    Source.Seek(0,soFromEnd);
    for i:=1 to FileNum//FileNum是文件数(加了几个文件):
    begin
      Source.Seek(-sizeof(MyFileSize),soFromCurrent);
      Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));
      Source.seek(-(MyFileSize - sizeof(MyFileSize)),soFromCurrent);
      Target.CopyFrom(Source,MyFileSize-sizeof(MyFileSize));
      Target.SaveToFile(TargetFile);//TargetFile已经在循环时赋值。
    end;请高手指点!!!
      

  8.   

    Source.Seek(0,soFromEnd);
    for i:=1 to FileNum//FileNum是文件数(加了几个文件):
    begin
      Source.Seek(-sizeof(MyFileSize),soFromCurrent);
      Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));
     Source.seek(-MyFileSize,soFromCurrent);//此处改
      Target.CopyFrom(Source,MyFileSize-sizeof(MyFileSize));
     Source.seek(-(MyFileSize-sizeof(MyFileSize)),soFromCurrent);//此处添
      Target.SaveToFile(TargetFile);//TargetFile已经在循环时赋值。
      
    end;
      

  9.   

    ZZZZZZZZZZZZZZZZZZ
    这么长,不爽,zzzzzzzzzzzzz
      

  10.   

    strongq(火血狼):再遇到问题再问你。