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

  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. Button1: TButton;
  12. Button2: TButton;
  13. procedure Button1Click(Sender: TObject);
  14. procedure Button2Click(Sender: TObject);
  15. end;
  16.  
  17. var
  18. Form1: TForm1;
  19.  
  20. implementation
  21.  
  22. {$R *.dfm}
  23.  
  24. //分割文件的函数
  25. {参数 1 是要分割的文件名; 参数 2 是要风格文件的大小, 单位是 KB}
  26. {分割后的文件名扩展名用序号替换}
  27. function SplitFile(const FileName: string; Size: Cardinal): Boolean;
  28. var
  29. fStream: TFileStream; {原始文件}
  30. toStream: TMemoryStream; {分文件}
  31. p,i: Integer; {p 记录当前指针位置; i 记录这是第几个分的文件}
  32. begin
  33. Result := False;
  34.  
  35. Size := Size * ; {把大小的单位转换为字节}
  36.  
  37. fStream := TFileStream.Create(FileName, fmOpenRead);
  38. p := ;
  39. i := ;
  40.  
  41. toStream := TMemoryStream.Create;
  42.  
  43. while p < fStream.Size do
  44. begin
  45. toStream.Clear; {清空上次数据}
  46. fStream.Position := p; {放好指针位置}
  47.  
  48. if fStream.Size-p < Size then Size := fStream.Size-p; {最后一个时, 有多少算多少}
  49.  
  50. toStream.CopyFrom(fStream, Size); {复制}
  51. toStream.SaveToFile(FileName + '.' + IntToStr(i)); {保存}
  52. Inc(i);
  53. p := p + Size;
  54. end;
  55.  
  56. fStream.Free;
  57. toStream.Free;
  58. Result := True;
  59. end;
  60.  
  61. //合并文件, 参数是其中一个分文件名
  62. function MergeFile(const FileName: string): Boolean;
  63. var
  64. ms: TMemoryStream; {读取分文件}
  65. fs: TFileStream; {合并后的文件}
  66. path: string;
  67. i: Integer;
  68. begin
  69. path := ChangeFileExt(FileName,''); {去掉序号扩展名}
  70. ShowMessage(path);
  71. i := ;
  72.  
  73. ms := TMemoryStream.Create;
  74. fs := TFileStream.Create(path, fmCreate);
  75.  
  76. while FileExists(path + '.' + IntToStr(i)) do
  77. begin
  78. ms.LoadFromFile(path + '.' + IntToStr(i));
  79. fs.CopyFrom(ms, ); {TFileStream 不需要 SetSize; 但如果用 TMemoryStream 就需要}
  80. Inc(i);
  81. end;
  82.  
  83. ms.Free;
  84. fs.Free;
  85. end;
  86.  
  87. //测试分割
  88. procedure TForm1.Button1Click(Sender: TObject);
  89. begin
  90. SplitFile('c:\temp\test.txt', );
  91. end;
  92.  
  93. //测试合并
  94. procedure TForm1.Button2Click(Sender: TObject);
  95. begin
  96. MergeFile('c:\temp\test.txt.0');
  97. end;
  98.  
  99. 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);

  1. //合并文件, 参数是合并后的文件名
  2. function TForm1.MergeFile(const FileName: string): Boolean;
  3. const
  4. s1 = ########;
  5. var
  6. ms: TMemoryStream; {读取分文件}
  7. fs: TFileStream; {合并后的文件}
  8. path,spliteStr: string;
  9. i: Integer;
  10. begin
  11. result := False;
  12. ms := TMemoryStream.Create;
  13. fs := TFileStream.Create(FileName, fmCreate);
  14.  
  15. try
  16. for i := to lst1.items.Count - do
  17. begin
  18. if i = 0then
  19. spliteStr := '#' + lst1.items[i] + ######
  20. else
  21. spliteStr := ###### + '#' + lst1.items[i] + ######;
  22.  
  23. ms.LoadFromFile(pathtemp + lst1.items[i]);
  24. fs.Write(PChar(spliteStr)^,length(spliteStr));
  25. fs.Seek(,soFromEnd);
  26. fs.CopyFrom(ms, )
  27. end;
  28. Result := true;
  29. finally
  30. ms.Free;
  31. fs.Free;
  32. end;
  33. end;
  34.  
  35. //合并文件, 参数是合并后的文件名
  36. function TForm1.MergeFile(const FileName: string): Boolean;
  37. const
  38. s1 = ########;
  39. var
  40. ms: TMemoryStream; {读取分文件}
  41. fs: TFileStream; {合并后的文件}
  42. path,spliteStr: string;
  43. i: Integer;
  44. begin
  45. result := False;
  46. ms := TMemoryStream.Create;
  47. fs := TFileStream.Create(FileName, fmCreate);
  48.  
  49. try
  50. for i := to lst1.items.Count - do
  51. begin
  52. if i = 0then
  53. spliteStr := '#' + lst1.items[i] + ######
  54. else
  55. spliteStr := ###### + '#' + lst1.items[i] + ######;
  56. ms.LoadFromFile(pathtemp + lst1.items[i]);
  57. fs.Write(PChar(spliteStr)^,length(spliteStr));
  58. fs.Seek(,soFromEnd);
  59. fs.CopyFrom(ms, )
  60. end;
  61. Result := true;
  62. finally
  63. ms.Free;
  64. fs.Free;
  65. end;

文件分割

  1. var i, WantedFragSize, RealToWrite : Integer;
  2. //声明两个文件流对象
  3. //InStream为输入源文件流对象,OutStream为输出切割文件流对象
  4. InStream, OutStream : TFileStream;
  5. S : String;
  6. begin
  7. if Opendialog1.Execute then
  8.   begin
  9.    SaveDialog1.Title := '输入你要保存的切割文件名';
  10.    If SaveDialog1.Execute then
  11.    begin
  12.     WantedFragSize := StrtoInt(Edit1.Text); //定义切割块大小
  13.     i := ;
  14.     //以只读的方式创建一个输入文件流对象
  15.     InStream:=TFileStream.Create(
  16.     OpenDialog1.FileName,fmOpenRead);
  17.     Try
  18.      //如果Instream流的当前指针位置不在末尾,就按照定义的块大小//来读出数据并存成文件
  19.      while (InStream.Position < InStream.Size) do
  20.      Begin
  21.       s := IntToStr(I);
  22.       while Length(s) < do s := ''+s;
  23.       s := '.'+s;
  24.       //生成切割文件的扩展名,用三位数字来作为扩展名,方便组合文件
  25.       //如果InStream所剩的块大小小于定义的块大小,则将剩下的块数//据存成文件
  26.       If InStream.Size - InStream.Position < WantedFragSize then
  27.        RealToWrite := InStream.Size - InStream.Position
  28.       else
  29.        RealToWrite := WantedFragSize;
  30.        //创建一个输出文件流对象
  31.        OutStream:=TFileStream.Create(SaveDialog1.FileName+s,fmCreate);
  32.        try
  33.         OutStream.CopyFrom(InStream,RealToWrite);
  34.         Inc(i);
  35.        Finally
  36.         //释放输出文件流对象
  37.         OutStream.Free;
  38.         end;
  39.        end;
  40.       Finally
  41.        InStream.Free;
  42.       end;
  43.      end;
  44.     end;

文件切割组合

  1. //切割文件
  2. procedure TForm1.Button1Click(Sender: TObject);
  3.  var
  4.   i, WantedFragSize, RealToWrite : Integer;
  5.   //声明两个文件流对象
  6.   //InStream为输入源文件流对象,OutStream为输出切割文件流对象
  7.   InStream, OutStream : TFileStream;
  8.   S : String;
  9.  begin
  10.   if Opendialog1.Execute then
  11.   begin
  12.    SaveDialog1.Title := '输入你要保存的切割文件名';
  13.    If SaveDialog1.Execute then
  14.    begin
  15.     WantedFragSize := StrtoInt(Edit1.Text); //定义切割块大小
  16.     i := ;
  17.     //以只读的方式创建一个输入文件流对象
  18.     InStream:=TFileStream.Create(
  19.     OpenDialog1.FileName,fmOpenRead);
  20.     Try
  21.      //如果Instream流的当前指针位置不在末尾,就按照定义的块大小//来读出数据并存成文件
  22.      while (InStream.Position < InStream.Size) do
  23.      Begin
  24.       s := IntToStr(I);
  25.       while Length(s) < do s := ''+s;
  26.       s := '.'+s;
  27.       //生成切割文件的扩展名,用三位数字来作为扩展名,方便组合文件
  28.       //如果InStream所剩的块大小小于定义的块大小,则将剩下的块数//据存成文件
  29.       If InStream.Size - InStream.Position < WantedFragSize then
  30.        RealToWrite := InStream.Size - InStream.Position
  31.       else
  32.        RealToWrite := WantedFragSize;
  33.        //创建一个输出文件流对象
  34.        OutStream:=TFileStream.Create(SaveDialog1.FileName+s,fmCreate);
  35.        try
  36.         OutStream.CopyFrom(InStream,RealToWrite);
  37.         Inc(i);
  38.        Finally
  39.         //释放输出文件流对象
  40.         OutStream.Free;
  41.         end;
  42.        end;
  43.       Finally
  44.        InStream.Free;
  45.       end;
  46.      end;
  47.     end;
  48.    end;
  49.  //组合文件
  50. procedure TForm1.Button2Click(Sender: TObject);
  51. var
  52.  i : Integer;
  53.  InStream, OutStream : TFileStream;
  54.  SourcePath, FragName, S : String;
  55.  begin
  56.   Opendialog1.Title := '请选择切割文件';
  57.   if Opendialog1.Execute then
  58.   begin
  59.    //得到当前打开的切割文件的路径
  60.    SourcePath := ExtractFilePath(Opendialog1.FileName);
  61.    //得到当前打开的切割文件的文件名
  62.    FragName := ExtractFileName(Opendialog1.FileName);
  63.    SaveDialog1.Title := '请输入你要组合的文件名';
  64.    If SaveDialog1.Execute then
  65.    begin
  66.     i := ;
  67.     s := IntToStr(I);
  68.     while Length(s) < do s := ''+s;
  69.      s := '.'+s;
  70.      FragName := ChangeFileExt(FragName, s);
  71.      //如果目录中有以.000为扩展名的文件存在,则创建一个输出文件流//对象
  72.      If FileExists(SourcePath+FragName) then
  73.      begin
  74.       OutStream:=TFileStream.Create(Savedialog1.FileName,fmCreate);
  75.      Try
  76.       //按照以文件扩展名递增的方式组合文件
  77.       While FileExists(SourcePath+FragName) do
  78.       Begin
  79.        InStream:=TFileStream.Create(SourcePath+FragName,fmOpenRead);
  80.       Try
  81.        //将输入文件流的数据写入到输出文件流中
  82.        OutStream.CopyFrom(InStream,);
  83.        Inc(i);
  84.        s := IntToStr(I);
  85.        while Length(s) < do s := ''+s;
  86.         s := '.'+s;
  87.         FragName := ChangeFileExt(FragName, s);
  88.       finally
  89.        InStream.Free;
  90.       end;
  91.      end;
  92.     finally
  93.      OutStream.Free;
  94.     end;
  95.    end;
  96.   end;
  97.  end;
  98. 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. 【架构】Linux结构

    Linux系统一般有4个主要部分: 内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使用系统.部分层次结构如图1-1所 ...

  2. beautifhulsoup4的使用

    Beautiful: - 基本使用 from bs4 import BeautifulSoup   - 解析器:       lxml, html.parser​   soup = Beautiful ...

  3. 【Flutter学习】页面跳转之路由及导航

    一,概述 移动应用通常通过成为‘屏幕’或者‘页面’的全屏元素显示其内容,在Flutter中,这些元素统称为路由,它们由导航器Navigator组件管理.导航器管理一组路由Route对象,并提供了管理堆 ...

  4. RealsenseD415/D435深度相机常用资料汇总

    1.Realsense SDK 2.0 Ubuntu 16.04 安装指导网址https://github.com/IntelRealSense/librealsense/blob/master/do ...

  5. hdu 5279 YJC plays Minecraft——生成函数

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5279 令 n 个点的树的 EGF 是 g(x) ,则 \( g(x) = \sum\limits_{i=0 ...

  6. 探索Redis设计与实现11:使用快照和AOF将Redis数据持久化到硬盘中

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  7. windows7+tomcat7+nginx1.11.3 +memcached

    测试的环境是windows7+tomcat7+nginx1.11.3 +memcached 安装方法网上很多就不多说了. 1.session共享需要这几个jar 包  下载地址 http://down ...

  8. selenium V1.0和V2.0差别对比

    Selenium 1.0 Selenium 1.0版本,就是大家所熟知的Selenium RC,其中 RC 是 Remote Control 的缩写.Selenium RC 的工作原理是 利用 Jav ...

  9. Gym 102021D : Down the Pyramid(思维)

    Do you like number pyramids? Given a number sequence that represents the base, you are usually suppo ...

  10. mysql 内连接和外连接查询

    一.内连接查询 (笛卡儿积) 内联接查询inner join,mysql可以简写为join 二.外连接查询 左外联接查询left outer join,mysql可以简写为left join右外联接查 ...