我看了一段将一个文件加在另一个文件的结尾并将它读出的例子:见下面的示例:
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;
读出后,好像有错误,读出的文件不能正常显示.不知代码错在什么地方.
指点一下,好吗?
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;
读出后,好像有错误,读出的文件不能正常显示.不知代码错在什么地方.
指点一下,好吗?
解决方案 »
- delphi7 如何打开文件夹显示上次的文件路径
- 出现这样的error[Fatal Error] BaseFormUnit.pas(26): File not found: 'XPMenu.dcu'如何解决
- 请问哪位大哥能告诉小弟如何用SQL语句查询某个表在库里是否已经存在?
- 简单:如何在sql语句中用into将查找的一个值付给一个变量??请提示一下
- 心急呀,在线等待~~关于RadioGroup的问题
- 刚入行,未入流的新手!有报表问题向各位请教???
- access数据库的压缩问题?
- 如果我建立一个word库,如何用dephi调用
- 如何将*.Swf文件加到资源文件中。并且调用。
- 运行提示TjpegImage等未声明,如何声明?
- 接口的问题
- 怎样让用户来选择保存的位置?
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;
如果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;
我不知道错在什么地方,请您帮忙!!!
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;
谢谢给我这段代码,我现在真搞不懂不错在什么地方?
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;
你的结构应该是: 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);
...
写的时候,前两个字节放的是文件合并的数目,然后写入一个文件,再用四个字节写入这个文件的大小+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;请高手指点!!!
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;
这么长,不爽,zzzzzzzzzzzzz