delphi 文件分割与合并
流的使用分割与合并文件的函数
- unit Unit1;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls;
- type
- TForm1 = class(TForm)
- Button1: TButton;
- Button2: TButton;
- procedure Button1Click(Sender: TObject);
- procedure Button2Click(Sender: TObject);
- end;
- var
- Form1: TForm1;
- implementation
- {$R *.dfm}
- //分割文件的函数
- {参数 1 是要分割的文件名; 参数 2 是要风格文件的大小, 单位是 KB}
- {分割后的文件名扩展名用序号替换}
- function SplitFile(const FileName: string; Size: Cardinal): Boolean;
- var
- fStream: TFileStream; {原始文件}
- toStream: TMemoryStream; {分文件}
- p,i: Integer; {p 记录当前指针位置; i 记录这是第几个分的文件}
- begin
- Result := False;
- Size := Size * ; {把大小的单位转换为字节}
- fStream := TFileStream.Create(FileName, fmOpenRead);
- p := ;
- i := ;
- toStream := TMemoryStream.Create;
- while p < fStream.Size do
- begin
- toStream.Clear; {清空上次数据}
- fStream.Position := p; {放好指针位置}
- if fStream.Size-p < Size then Size := fStream.Size-p; {最后一个时, 有多少算多少}
- toStream.CopyFrom(fStream, Size); {复制}
- toStream.SaveToFile(FileName + '.' + IntToStr(i)); {保存}
- Inc(i);
- p := p + Size;
- end;
- fStream.Free;
- toStream.Free;
- Result := True;
- end;
- //合并文件, 参数是其中一个分文件名
- function MergeFile(const FileName: string): Boolean;
- var
- ms: TMemoryStream; {读取分文件}
- fs: TFileStream; {合并后的文件}
- path: string;
- i: Integer;
- begin
- path := ChangeFileExt(FileName,''); {去掉序号扩展名}
- ShowMessage(path);
- i := ;
- ms := TMemoryStream.Create;
- fs := TFileStream.Create(path, fmCreate);
- while FileExists(path + '.' + IntToStr(i)) do
- begin
- ms.LoadFromFile(path + '.' + IntToStr(i));
- fs.CopyFrom(ms, ); {TFileStream 不需要 SetSize; 但如果用 TMemoryStream 就需要}
- Inc(i);
- end;
- ms.Free;
- fs.Free;
- end;
- //测试分割
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- SplitFile('c:\temp\test.txt', );
- end;
- //测试合并
- procedure TForm1.Button2Click(Sender: TObject);
- begin
- MergeFile('c:\temp\test.txt.0');
- end;
- end.
TFileStream 的读写 合并文件
TFileStream 的读写 合并文件
向TFileStream中写入字符串的问题
sbuff:TString;
S1:Tfilestream;
S1.write(sbuff,length(sbuff))是乱码
S1.write(pChar(sbuff)^,length(sbuff)))是对的~
求解释
S1.write(sbuff,length(sbuff))为什么不可以
还有length(sbuff)和sizaof(sbuff)的区别
解答:
两处错误
1,一定要先为你的string变量t指定长度(分配空间).
2,串变量t并不代表它分配的内存指针.
先SETLENGTH(T,30);
再T.READBUFFER(PCHAR(T)^,30);
不能用T.READBUFFER(T,30);
向TFileStream中写入字符串的问题
sbuff:TString;
S1:Tfilestream;
S1.write(sbuff,length(sbuff))是乱码
S1.write(pChar(sbuff)^,length(sbuff)))是对的~
求解释
S1.write(sbuff,length(sbuff))为什么不可以
还有length(sbuff)和sizaof(sbuff)的区别
解答:
两处错误
1,一定要先为你的string变量t指定长度(分配空间).
2,串变量t并不代表它分配的内存指针.
先SETLENGTH(T,30);
再T.READBUFFER(PCHAR(T)^,30);
- //合并文件, 参数是合并后的文件名
- function TForm1.MergeFile(const FileName: string): Boolean;
- const
- s1 = ########;
- var
- ms: TMemoryStream; {读取分文件}
- fs: TFileStream; {合并后的文件}
- path,spliteStr: string;
- i: Integer;
- begin
- result := False;
- ms := TMemoryStream.Create;
- fs := TFileStream.Create(FileName, fmCreate);
- try
- for i := to lst1.items.Count - do
- begin
- if i = 0then
- spliteStr := '#' + lst1.items[i] + ######
- else
- spliteStr := ###### + '#' + lst1.items[i] + ######;
- ms.LoadFromFile(pathtemp + lst1.items[i]);
- fs.Write(PChar(spliteStr)^,length(spliteStr));
- fs.Seek(,soFromEnd);
- fs.CopyFrom(ms, )
- end;
- Result := true;
- finally
- ms.Free;
- fs.Free;
- end;
- end;
- //合并文件, 参数是合并后的文件名
- function TForm1.MergeFile(const FileName: string): Boolean;
- const
- s1 = ########;
- var
- ms: TMemoryStream; {读取分文件}
- fs: TFileStream; {合并后的文件}
- path,spliteStr: string;
- i: Integer;
- begin
- result := False;
- ms := TMemoryStream.Create;
- fs := TFileStream.Create(FileName, fmCreate);
- try
- for i := to lst1.items.Count - do
- begin
- if i = 0then
- spliteStr := '#' + lst1.items[i] + ######
- else
- spliteStr := ###### + '#' + lst1.items[i] + ######;
- ms.LoadFromFile(pathtemp + lst1.items[i]);
- fs.Write(PChar(spliteStr)^,length(spliteStr));
- fs.Seek(,soFromEnd);
- fs.CopyFrom(ms, )
- end;
- Result := true;
- finally
- ms.Free;
- fs.Free;
- end;
文件分割
- var i, WantedFragSize, RealToWrite : Integer;
- //声明两个文件流对象
- //InStream为输入源文件流对象,OutStream为输出切割文件流对象
- InStream, OutStream : TFileStream;
- S : String;
- begin
- if Opendialog1.Execute then
- begin
- SaveDialog1.Title := '输入你要保存的切割文件名';
- If SaveDialog1.Execute then
- begin
- WantedFragSize := StrtoInt(Edit1.Text); //定义切割块大小
- i := ;
- //以只读的方式创建一个输入文件流对象
- InStream:=TFileStream.Create(
- OpenDialog1.FileName,fmOpenRead);
- Try
- //如果Instream流的当前指针位置不在末尾,就按照定义的块大小//来读出数据并存成文件
- while (InStream.Position < InStream.Size) do
- Begin
- s := IntToStr(I);
- while Length(s) < do s := ''+s;
- s := '.'+s;
- //生成切割文件的扩展名,用三位数字来作为扩展名,方便组合文件
- //如果InStream所剩的块大小小于定义的块大小,则将剩下的块数//据存成文件
- If InStream.Size - InStream.Position < WantedFragSize then
- RealToWrite := InStream.Size - InStream.Position
- else
- RealToWrite := WantedFragSize;
- //创建一个输出文件流对象
- OutStream:=TFileStream.Create(SaveDialog1.FileName+s,fmCreate);
- try
- OutStream.CopyFrom(InStream,RealToWrite);
- Inc(i);
- Finally
- //释放输出文件流对象
- OutStream.Free;
- end;
- end;
- Finally
- InStream.Free;
- end;
- end;
- end;
文件切割组合
- //切割文件
- procedure TForm1.Button1Click(Sender: TObject);
- var
- i, WantedFragSize, RealToWrite : Integer;
- //声明两个文件流对象
- //InStream为输入源文件流对象,OutStream为输出切割文件流对象
- InStream, OutStream : TFileStream;
- S : String;
- begin
- if Opendialog1.Execute then
- begin
- SaveDialog1.Title := '输入你要保存的切割文件名';
- If SaveDialog1.Execute then
- begin
- WantedFragSize := StrtoInt(Edit1.Text); //定义切割块大小
- i := ;
- //以只读的方式创建一个输入文件流对象
- InStream:=TFileStream.Create(
- OpenDialog1.FileName,fmOpenRead);
- Try
- //如果Instream流的当前指针位置不在末尾,就按照定义的块大小//来读出数据并存成文件
- while (InStream.Position < InStream.Size) do
- Begin
- s := IntToStr(I);
- while Length(s) < do s := ''+s;
- s := '.'+s;
- //生成切割文件的扩展名,用三位数字来作为扩展名,方便组合文件
- //如果InStream所剩的块大小小于定义的块大小,则将剩下的块数//据存成文件
- If InStream.Size - InStream.Position < WantedFragSize then
- RealToWrite := InStream.Size - InStream.Position
- else
- RealToWrite := WantedFragSize;
- //创建一个输出文件流对象
- OutStream:=TFileStream.Create(SaveDialog1.FileName+s,fmCreate);
- try
- OutStream.CopyFrom(InStream,RealToWrite);
- Inc(i);
- Finally
- //释放输出文件流对象
- OutStream.Free;
- end;
- end;
- Finally
- InStream.Free;
- end;
- end;
- end;
- end;
- //组合文件
- procedure TForm1.Button2Click(Sender: TObject);
- var
- i : Integer;
- InStream, OutStream : TFileStream;
- SourcePath, FragName, S : String;
- begin
- Opendialog1.Title := '请选择切割文件';
- if Opendialog1.Execute then
- begin
- //得到当前打开的切割文件的路径
- SourcePath := ExtractFilePath(Opendialog1.FileName);
- //得到当前打开的切割文件的文件名
- FragName := ExtractFileName(Opendialog1.FileName);
- SaveDialog1.Title := '请输入你要组合的文件名';
- If SaveDialog1.Execute then
- begin
- i := ;
- s := IntToStr(I);
- while Length(s) < do s := ''+s;
- s := '.'+s;
- FragName := ChangeFileExt(FragName, s);
- //如果目录中有以.000为扩展名的文件存在,则创建一个输出文件流//对象
- If FileExists(SourcePath+FragName) then
- begin
- OutStream:=TFileStream.Create(Savedialog1.FileName,fmCreate);
- Try
- //按照以文件扩展名递增的方式组合文件
- While FileExists(SourcePath+FragName) do
- Begin
- InStream:=TFileStream.Create(SourcePath+FragName,fmOpenRead);
- Try
- //将输入文件流的数据写入到输出文件流中
- OutStream.CopyFrom(InStream,);
- Inc(i);
- s := IntToStr(I);
- while Length(s) < do s := ''+s;
- s := '.'+s;
- FragName := ChangeFileExt(FragName, s);
- finally
- InStream.Free;
- end;
- end;
- finally
- OutStream.Free;
- end;
- end;
- end;
- end;
- end;
delphi 文件分割与合并的更多相关文章
- java:快速文件分割及合并
文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再进行合并.很多高大上的分布式文件系统(比如:google的GFS.taobao的TFS)里,也是按block为单位, ...
- (转)java:快速文件分割及合并
文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再进行合并.很多高大上的分布式文件系统(比如:google的GFS.taobao的TFS)里,也是按block为单位, ...
- JAVA IO分析三:IO总结&文件分割与合并实例
时间飞逝,马上就要到2018年了,今天我们将要学习的是IO流学习的最后一节,即总结回顾前面所学,并学习一个案例用于前面所学的实际操作,下面我们就开始本节的学习: 一.原理与概念 一.概念流:流动 .流 ...
- c语言文件分割与合并
一.综述 c语言操作文件通过文件指针FILE*,每个要操作的文件必须打开然后才能读写. 注意事项: @1分割与合并文件最好使用二进制模式即"rb"或"wb",这 ...
- PDF文件分割和合并
今天自己用C#实现了下PDF文件的分割和合并,大家可以试用一下. 代码和使用说明在这里:https://github.com/cserspring/pdf_split_merge 有什么意见,大家可以 ...
- python学习——大文件分割与合并
在平常的生活中,我们会遇到下面这样的情况: 你下载了一个比较大型的游戏(假设有10G),现在想跟你的同学一起玩,你需要把这个游戏拷贝给他. 然后现在有一个问题是文件太大(我们不考虑你有移动硬盘什么的情 ...
- PHP大文件存储示例,各种文件分割和合并(二进制分割与合并)
最近要对视频进行上传,由于涉及到的视频非常的大,因此采用的是分片上传的格式,下面是一个简单的例子: split.php <?php $i = 0; //分割的块编号 $fp = fopen(&q ...
- Wireshark 文件分割和合并
# 捕获文件的基本信息. capinfos <filename> 从结果中可以看到 http.pcapng 捕获文件的基本信息,包括文件类型.封装.包大小限制.包数.文件大小及时间等. # ...
- Php处理大文件-分割和合并
分割文件 /* * 分割文件 * 默认大小 2M=10485760/5 */ function file_split($file,$block_size=10485760/5) { $block_in ...
随机推荐
- 【架构】Linux结构
Linux系统一般有4个主要部分: 内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使用系统.部分层次结构如图1-1所 ...
- beautifhulsoup4的使用
Beautiful: - 基本使用 from bs4 import BeautifulSoup - 解析器: lxml, html.parser soup = Beautiful ...
- 【Flutter学习】页面跳转之路由及导航
一,概述 移动应用通常通过成为‘屏幕’或者‘页面’的全屏元素显示其内容,在Flutter中,这些元素统称为路由,它们由导航器Navigator组件管理.导航器管理一组路由Route对象,并提供了管理堆 ...
- RealsenseD415/D435深度相机常用资料汇总
1.Realsense SDK 2.0 Ubuntu 16.04 安装指导网址https://github.com/IntelRealSense/librealsense/blob/master/do ...
- hdu 5279 YJC plays Minecraft——生成函数
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5279 令 n 个点的树的 EGF 是 g(x) ,则 \( g(x) = \sum\limits_{i=0 ...
- 探索Redis设计与实现11:使用快照和AOF将Redis数据持久化到硬盘中
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- windows7+tomcat7+nginx1.11.3 +memcached
测试的环境是windows7+tomcat7+nginx1.11.3 +memcached 安装方法网上很多就不多说了. 1.session共享需要这几个jar 包 下载地址 http://down ...
- selenium V1.0和V2.0差别对比
Selenium 1.0 Selenium 1.0版本,就是大家所熟知的Selenium RC,其中 RC 是 Remote Control 的缩写.Selenium RC 的工作原理是 利用 Jav ...
- Gym 102021D : Down the Pyramid(思维)
Do you like number pyramids? Given a number sequence that represents the base, you are usually suppo ...
- mysql 内连接和外连接查询
一.内连接查询 (笛卡儿积) 内联接查询inner join,mysql可以简写为join 二.外连接查询 左外联接查询left outer join,mysql可以简写为left join右外联接查 ...