关于TXT文件分割成TXT文件 ( 积分: 100 )

  • 主题发起人 主题发起人 zhangsolomon
  • 开始时间 开始时间
Z

zhangsolomon

Unregistered / Unconfirmed
GUEST, unregistred user!
各位 高手
想将TXT文件分割成多个TXT文件 该如何啊
我用了简单的流处理了下 可是分割后比如分割的地方正好是个汉字就会出现乱码(汉字是两个字节的原因) 不知道怎么解决!
高手们最后能给个源程序完整的代码 !
谢谢了 跪求!!
 
各位 高手
想将TXT文件分割成多个TXT文件 该如何啊
我用了简单的流处理了下 可是分割后比如分割的地方正好是个汉字就会出现乱码(汉字是两个字节的原因) 不知道怎么解决!
高手们最后能给个源程序完整的代码 !
谢谢了 跪求!!
 
划分的原则是什么,按大小平均?汉字可以判断的,可以查看你要分割哪个地方的最后一个字节是什么,然后判断是不是汉字的一部分。论坛里面有很多
 
先分割第一组,再检测一下最后一个字符的ascii码,看看是否为英文及汉字编码范围。如果不是就多分个字节。然后继续。
 
用IsDBCSLeadByte判断是不是汉字的

一个汉字占据两个字节,这个两个字节的序号的范围(序号)分别处于:
第一个字节129 - 254
第二个字节64 - 254
中文标点符号第一个字节的范围 161-169

看看对你有用没有
 
楼上的说的不错。
楼上的是个牛人,佩服!
 
呵呵 有人说 用下面这个。。。
WideString检测最方便:)
 
不好意思 这个星期去了南京 办事 没来的及看回复
是这样的判断汉字的方法 我找到了几种
TO chenybin, 大概的思路我也知道
只是 呵呵 俺用流操作很逊色 所以不晓得从流中 怎么把我要的数据取出来
我找到了些资料按上面的操作做了 可是运行的时候出现了内存错误
所以望高手能给点具体的例子
恩 分割的条件基本上是按大小平均分割的 就是几个KB的来分割 !!
 
楼主把代码贴出来,看看是什么方面的问题

WideString 这个是方便,但是在流里面取出来的不一定就是完整的一个WideString
 
实现文件切割-组合



一、 文件切割/组合原理

  所谓文件切割,就是把一个文件切割成若干个小文件。做法就是将一个文件对象以"文件流"的方式读出,然后按照一定的块(Block)大小分别存成文件。文件组合,就是把若干个文件组合成一个文件。比如像打包工具(Wise)用到的就是这个原理。如果大家对"流"这个概念熟悉的话,那么实现起来就很容易了,以下就是实现步骤。



二、 实现

  在DELPHI中新建一个工程,然后在窗体中加入两个BUTTON,一个EDIT,一个OPENDIALOG,一个SAVEDIALOG,再将BUTTON1的CAPTION改为"切割",BUTTON2的CAPTION改为"组合"(注:其它控件的属性略)。再双击BUTTON1和BUTTON2,写下如下代码:





//切割文件

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

    //以只读的方式创建一个输入文件流对象

    InStream:=TFileStream.Create(

    OpenDialog1.FileName,fmOpenRead);

    Try

     //如果Instream流的当前指针位置不在末尾,就按照定义的块大小//来读出数据并存成文件

     while (InStream.Position < InStream.Size) do

     Begin

      s := IntToStr(I);

      while Length(s) < 3 do s := '0'+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 := 0;

    s := IntToStr(I);

    while Length(s) < 3 do s := '0'+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,0);

       Inc(i);

       s := IntToStr(I);

       while Length(s) < 3 do s := '0'+s;

        s := '.'+s;

        FragName := ChangeFileExt(FragName, s);

      finally

       InStream.Free;

      end;

     end;

    finally

     OutStream.Free;

    end;

   end;

  end;

 end;

end;





  {*注释:请注意COPYFROM方法的使用,当第二个参数为0时,表示将输入流InStream的数据全部写入输出流OutStream;当大于0为N时,表示从输入流InStream的当前流指针位置开始,将N个字节数据写入输出流OutStream,并且InStream的流指针会向后偏移N个字节位数。详细解释请查看DELPHI自带的帮助*}



  三、结束语



  在我们用到的很多日常工具中,有很多都会用到的&quot;流&quot;这个对象,它的作用也非常大,例如文件加密,文件下载等都会涉及到&quot;流&quot;,所以笔者认为,掌握它是很有用的,也是比较重要的。
 
呵呵 崩溃 恩 基本是我的代码是在 无泪的基础上修改的
而实质上没修改 我只是把 分割后保存文件的后罪名 改成了TXT而已
所以分割的代码就和上面 无泪的代码一样 !!
能在上面的基础上修改吗?
可惜 我用流中取出数据的那个DM 因为不成功被删了 呵呵!
无法 !
chenybin 大哥 能帮忙改下不?
 
把你的代码贴出来,并说明哪里有问题,我再帮你看看吧
 
多人接受答案了。
 
后退
顶部