流的使用分割与合并文件的函数

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 文件分割与合并的更多相关文章

  1. java:快速文件分割及合并

    文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再进行合并.很多高大上的分布式文件系统(比如:google的GFS.taobao的TFS)里,也是按block为单位, ...

  2. (转)java:快速文件分割及合并

    文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再进行合并.很多高大上的分布式文件系统(比如:google的GFS.taobao的TFS)里,也是按block为单位, ...

  3. JAVA IO分析三:IO总结&文件分割与合并实例

    时间飞逝,马上就要到2018年了,今天我们将要学习的是IO流学习的最后一节,即总结回顾前面所学,并学习一个案例用于前面所学的实际操作,下面我们就开始本节的学习: 一.原理与概念 一.概念流:流动 .流 ...

  4. c语言文件分割与合并

    一.综述 c语言操作文件通过文件指针FILE*,每个要操作的文件必须打开然后才能读写. 注意事项: @1分割与合并文件最好使用二进制模式即"rb"或"wb",这 ...

  5. PDF文件分割和合并

    今天自己用C#实现了下PDF文件的分割和合并,大家可以试用一下. 代码和使用说明在这里:https://github.com/cserspring/pdf_split_merge 有什么意见,大家可以 ...

  6. python学习——大文件分割与合并

    在平常的生活中,我们会遇到下面这样的情况: 你下载了一个比较大型的游戏(假设有10G),现在想跟你的同学一起玩,你需要把这个游戏拷贝给他. 然后现在有一个问题是文件太大(我们不考虑你有移动硬盘什么的情 ...

  7. PHP大文件存储示例,各种文件分割和合并(二进制分割与合并)

    最近要对视频进行上传,由于涉及到的视频非常的大,因此采用的是分片上传的格式,下面是一个简单的例子: split.php <?php $i = 0; //分割的块编号 $fp = fopen(&q ...

  8. Wireshark 文件分割和合并

    # 捕获文件的基本信息. capinfos <filename> 从结果中可以看到 http.pcapng 捕获文件的基本信息,包括文件类型.封装.包大小限制.包数.文件大小及时间等. # ...

  9. Php处理大文件-分割和合并

    分割文件 /* * 分割文件 * 默认大小 2M=10485760/5 */ function file_split($file,$block_size=10485760/5) { $block_in ...

随机推荐

  1. hibernate 双向1对多

    1: 还是用客户Customer和订单Order来解释: “一对多”的物理意义:一个客户可以有多个订单,某个订单只能归宿于一个客户. “双向”的物理意义:客户知道自己有哪些订单,订单也知道自己归宿于哪 ...

  2. Git Git管理码云项目

    Git  一.下载安装 1. 要使用git 先安转git 请到官网下载最新git  https://git-scm.com/downloads 2. 一路默认安装,安装完成右键查看下是否有Git. 二 ...

  3. 存储-docker volume 生命周期管理(14)

    volume 生命周期管理 - 每天5分钟玩转 Docker 容器技术(44) Data Volume 中存放的是重要的应用数据,如何管理 volume 对应用至关重要.前面我们主要关注的是 volu ...

  4. https://www.cnblogs.com/limanjihe/p/10184327.html

    https://www.cnblogs.com/limanjihe/p/10184327.html https://blog.csdn.net/xnnswmzdszyd/article/details ...

  5. numpy的函数使用

    目录 注 help ,帮助 numpy.genfromtxt,导入文件 array,创建数组(1,2维数组) array,创建行列向量 numpy.shape,看numpy数据的行列信息 numpy. ...

  6. MySQL的安装配置(无坑

    简单记录一下自己掉坑无数之后,终于找到的一个不坑的方法. 一.安装 #进入一个习惯的文件夹 cd /usr/local/src #下载资源包 wget -i -c http://dev.mysql.c ...

  7. 代码质量管理-Sonar

    1.Sonar 摘要 Sonar 是一个用于代码质量管理的开放平台.通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具. 与持续集成工具(例如 Hudson/Jenkin ...

  8. 通过一条很慢的SQL梳理下SQL优化基础

  9. python while循坏和for循坏

    while循坏 while 条件: 条件成立,执行循坏体(注意,while循坏必须有结束条件,不然会进入死循坏) 简单做个演示: # -*- coding:utf-8 -*- # Author:覃振鸿 ...

  10. spring 中各个配置文件的说明

    (1)pom.xml pom.xml文件是在整个项目下面,该xml的主要作用是:导入框架的jar包及其所依赖的jar包,导入的jar包是写在<dependencies></depen ...