首页 > 其他分享 >关于 Delphi 中流的使用 分割与合并文件的函数

关于 Delphi 中流的使用 分割与合并文件的函数

时间:2023-05-13 09:12:10浏览次数:33  
标签:分割 toStream end fStream Delphi begin path 中流 Size

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 * 1024;     {把大小的单位转换为字节}

  fStream := TFileStream.Create(FileName, fmOpenRead);
  p := 0;
  i := 0;

  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 := 0;

  ms := TMemoryStream.Create;
  fs := TFileStream.Create(path, fmCreate);

  while FileExists(path + '.' + IntToStr(i)) do
  begin
    ms.LoadFromFile(path + '.' + IntToStr(i));
    fs.CopyFrom(ms, 0); {TFileStream 不需要 SetSize; 但如果用 TMemoryStream 就需要}
    Inc(i);
  end;

  ms.Free;
  fs.Free;
end;



//测试分割
procedure TForm1.Button1Click(Sender: TObject);
begin
  SplitFile('c:\temp\test.txt', 10);
end;

//测试合并
procedure TForm1.Button2Click(Sender: TObject);
begin
  MergeFile('c:\temp\test.txt.0');
end;

end.

标签:分割,toStream,end,fStream,Delphi,begin,path,中流,Size
From: https://www.cnblogs.com/lucken2000/p/17396738.html

相关文章

  • 关于 Delphi 中流的使用 用流读写结构化文件
    unitUnit1;interfaceuses Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms, Dialogs,StdCtrls;type TForm1=class(TForm)  Memo1:TMemo;  {添加Memo显示内容}  Button1:TButton;  Button2:TButton; ......
  • 关于 Delphi 中流的使用 用 TMemoryStream(内存流) 入门
    所谓"流",就是一段数据或是一块内存;在进行流操作时,我们不必关心流中的数据到底是什么;只需要知道流的大小和当前的指针位置.所以流只有两个属性:Size、Position.对流的操作,不过就是读取和写入.所以流最主要的方法就是Read和Write.在很多控件的使用中,读取主要用Load......
  • 关于 Delphi 中流的使用 遍历读取流中的所有数据
    unitUnit1;interfaceuses Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms, Dialogs,StdCtrls;type TForm1=class(TForm)  Memo1:TMemo;  Memo2:TMemo;{需要添加两个Memo用于显示}  Button1:TButton;  ......
  • delphi StyleControl中DB控件的使用说明
    这两天听大佬说"可视化绑定"的效率很低,再加对下拉菜单,单选,复选框等控件绑定操作的未知,于是我决定把普通组件,改为DB组件. 正常来讲,基本上所有DB组件只要设置好了数据源和字段绑定,就能显示数据来, 但是我这边就出现了一点意外,源于对sqlite数据库认知度不够的原因......
  • Delphi 字符串拆分/分割[1] - TStringList
    1、TStringList默认以','拆分字符onstconstr:String='aaa,bbb,ccc,ddd';varstrs:TStrings;i:Integer;beginstrs:=TStringList.Create;strs.CommaText:=constr;fori:=0toStrs.Count-1doShowMessage(Strs[i]);//aaabbbcccd......
  • delphi模板引擎
    programExample;usesSempare.Template;typeTInformation=recordname:string;favourite_sport:string;count:integer;end;beginvartpl:=Template.Parse('Mynameis<%name%>.'#13#10+'Myfavouritesportis<%......
  • Delphi中使用ADO连接Excel
    第一部分: 1.设置ADOConnection的ConnectionString属性的OLEDB的提供者要选择MicrosoftJet4.0OLEDBProvider(这本来是用于连接Access数据库的驱动程序,但也可打开Excel文件),按"下一步"按钮2.选择数据库名称。注意:Excel的扩展名是*.xls,而默认文件类型是MicrosoftAcce......
  • 通用AI大型模型Segment Anything在医学图像分割领域的最新成果!
    前言 SAM是一种在自然图像分割方面取得成功的模型,但在医学图像分割方面表现不佳。MedSAM首次尝试将SAM的成功扩展到医学图像,并成为用于分割各种医学图像的通用工具。为了开发MedSAM,首先需要一个大型医学图像数据集,其中包括来自11种不同模态的超过20万个Mask。该数据集......
  • m基于遗传优化的阈值分割算法的雾天图像去雾增强matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:       2.算法涉及理论知识概要       遗传算法GA把问题的解表示成“染色体”,在算法中也即是以二进制编码的串。并且,在执行遗传算法之前,给出一群“染色体”,也即是假设解。然后,把这些假设解置于问题的“环境”......
  • 模板元编程--TypeList算法--类型分割
    将一个数据列表按照要求尽心分割为两个类型。usinglist1=TypeList<char,double,float,longlong,int,int>;将大于4字节的分为一组,其他分为一组:贴入Fold函数,一会儿用到:template<typenameT>conceptTL=requires{typenameT::isTypeList;typenameT::ty......