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;
1)
Target.Seek(0, soFromEnd);
这里的seek是指定指针位置吗 如果是Target.Seek(-1, soFromEnd); 那么是不是文件的尾往前一个位置
2)
Target.CopyFrom(Source, 0);
这里的拷贝函数第2个参数为0时,设置source的position为0才拷贝source所有数据,但这个函数里没有设置position为0
是不是默认为0呢
3)
这里的MyFileSize := Source.Size + sizeof(MyFileSize); 为什么要加上sizeof(MyFileSize)
4)
Target.WriteBuffer(MyFilesize, SizeOf(MyFileSize));
这里的参数缓冲区为什么可以是一个integer类型的呀 我对缓冲区不懂哦 到底是啥 应该什么类型希望老大们帮我解答其中的问题,谢谢了~~
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;
1)
Target.Seek(0, soFromEnd);
这里的seek是指定指针位置吗 如果是Target.Seek(-1, soFromEnd); 那么是不是文件的尾往前一个位置
2)
Target.CopyFrom(Source, 0);
这里的拷贝函数第2个参数为0时,设置source的position为0才拷贝source所有数据,但这个函数里没有设置position为0
是不是默认为0呢
3)
这里的MyFileSize := Source.Size + sizeof(MyFileSize); 为什么要加上sizeof(MyFileSize)
4)
Target.WriteBuffer(MyFilesize, SizeOf(MyFileSize));
这里的参数缓冲区为什么可以是一个integer类型的呀 我对缓冲区不懂哦 到底是啥 应该什么类型希望老大们帮我解答其中的问题,谢谢了~~
解决方案 »
- 如何声明一个类
- comport控件读取串口数据,怎么经常把一整个数据分成2部分来读啊,这就变成2个数据了啊~
- 公司里面第三方控键用哪些?
- 提取字符串中的字符函数?
- 关于interbase注册服务器
- 向高手求助!!NMSMTP控件中的认证函数:nmsmtp.verify(s:string) 参数s的内容是什么?
- 使用COM时,怎么传入一个字符串?
- FastReport中,如何在程序中指定报表中要打印的某张图片(不用数据库的方式)!**********************
- 用sql语句如何生成一个与源表(a.dbf)结构一致的表?急~
- 再问一个关于写入文本文件的问题,在线等
- 大家推荐个好用点的编译器啊,
- 请问在ro的da中能直接使用schema执行execsql代码吗?
2)Source := TFileStream.Create...
Source的初始位置就为0
3)procedure WriteBuffer(const Buffer; Count: Longint);
buff可以是任何类型的变量.
MyFileSize := Source.Size + sizeof(MyFileSize);
这是你程序中文件格式要求的,最终的文件长度是源文件的长加上一个整形的长度:
Target.WriteBuffer(MyFilesize, SizeOf(MyFileSize));
比源文件多写了一个integer
Function Seek(Offset:Longint;Origint:Word):Longint;virtual;abstract;
参数Offset为偏移字节数,参数Origint指出Offset的实际意义,其可能的取值如下:
soFromBeginning:Offset为移动后指针距离数据开始的位置。此时Offset必须大于或者等于零。
soFromCurrent:Offset为移动后指针与当前指针的相对位置。
soFromEnd:Offset为移动后指针距离数据结束的位置。此时Offset必须小于或者等于零。该方法返回值为移动后指针的位置。 2.此方法的作用是从其它流中拷贝数据流。函数原形为:
Function CopyFrom(Source:TStream;Count:Longint):Longint;
参数Source为提供数据的流,Count为拷贝的数据字节数。当Count大于0时,CopyFrom从Source参数的当前位置拷贝Count个字节的数据;当Count等于0时,CopyFrom设置Source参数的Position属性为0,然后拷贝Source的所有数据; 3.因为你这里要在流的尾部添加1个integer类型数值(当前流的大小)4.WriteBuffer:此方法的作用是在当前位置向流写入数据,把你上面计算的当前流的大小写入流的尾部。