Board logo

标题: 用DOS命令如何截短一个大文件? [打印本页]

作者: telent     时间: 2006-12-14 06:05    标题: 用DOS命令如何截短一个大文件?

比如将一个100M的文件截短为90M,截掉的10M就不要了。
作者: lxmxn     时间: 2006-12-14 06:40

  先汗一个。

  不知道你说的截取是什么意思,是简单的变换文件的大小,还是什么?截掉之后文件的功能不就失去了么?

作者: a9319751     时间: 2006-12-14 06:52
我也想知道,网上下的电视剧每集都有序幕和结束的字幕,如果能批处理掉就好了,可以连放了
作者: tianzizhi     时间: 2006-12-14 07:16
electronixtar兄说过了用下面的方法:

C:\WINDOWS\system32>fsutil.exe file setvaliddata
用法 : fsutil file setvaliddata <文件名> <数据长度>
例如 : fsutil file setvaliddata C:\testfile.txt 4096
如果是fat的话,你不能用的话,你转换一下格式吧,用convert命令,速度很快,一两分钟就搞定,如果你不愿这样的话,说实话在window下自带的dos命令是没法分割文件的.

下面是自己做一个在dos下做一个分割工具,会弄的朋友试一下吧,用微软的visual studio .net开发环境的C#语言来设计一个文件分割器,并且以DOS命令行方式运行,就象使用copy命令一样简单。从中也可以了解文件分割的原理以及.net框架对文件的读写操作方式。

         新建一个visual
      c#项目,选择“控制台应用程序”,项目名称设置为filesplitcon,系统自动产生了class1.cs文件,将以下的代码加入到class1.cs的相应区域中:

      using System;

      using System.Data;

      using System.IO;



      namespace filesplitcon

      {

          /// <summary>

          /// Class1 的摘要说明。

          /// </summary>

          class Class1

          {

             /// <summary>

             /// 应用程序的主入口点。

             /// </summary>

             [STAThread]

             static void Main(string[] args)

             {

                 if(args[0]=="s")

                 {

                 int i;

                    FileStream fr = new FileStream(args[1],FileMode.Open,
      FileAccess.Read );



                    int FileSize =  Convert.ToInt32(fr.Length)
      /Convert.ToInt32(args[2]);



                        StreamWriter fwlist = new StreamWriter(args[1] "."
      "list",false);

                    

                        for(i=1;i<=Convert.ToInt32(args[2]);i )

                        {  

                           byte [] byteread=new byte[FileSize] ;

                           fr.Read(byteread,0,FileSize);



                           FileStream fw = new FileStream(args[1] "."
      i ,FileMode.CreateNew, FileAccess.Write);

                           fwlist.WriteLine(args[1] "." i );

                           foreach(byte bNext in byteread)

                               fw.WriteByte(bNext) ;

                           fw.Close();

                        }

                        if( fr.Length!=fr.Position )

                        {

                           byte [] byteread=new byte[Convert.ToInt32(fr.Length)
      -FileSize*(i-1)] ;

                           fr.Read(byteread,0,Convert.ToInt32(fr.Length)
      -FileSize*(i-1));



                           FileStream fw = new FileStream(args[1] "."
      i ,FileMode.CreateNew, FileAccess.Write);

                    

                           fwlist.WriteLine(args[1] "." i );

         

                           foreach(byte bNext in byteread)

                               fw.WriteByte(bNext) ;

                           fw.Close();

                        }

                        fr.Close();

                        fwlist.Flush();

                        fwlist.Close();



                    Console.WriteLine("文件分割结束");

                    }



                 if(args[0]=="m")

                 {

                    StreamReader frlist=new StreamReader(args[1] "." "list");



                    FileStream fw = new FileStream(args[1] ,FileMode.Append,
      FileAccess.Write);



                    string sline;

                    sline=frlist.ReadLine();



                    while(sline!=null)

                    {

                        FileStream fr = new FileStream(sline,FileMode.Open,
      FileAccess.Read );

                      

                        byte [] byteread=new byte[fr.Length] ;

                        fr.Read(byteread,0,Convert.ToInt32(fr.Length));



                        foreach(byte bNext in byteread)

                           fw.WriteByte(bNext) ;

                        fr.Close();

                        sline=frlist.ReadLine();



                    }

                    frlist.Close();

                    fw.Close();



                    Console.WriteLine("文件合并结束");



                 }



             }

          }

      }



      编译后,在bin/debug下生成了可执行文件,大小只有6.5kb,将这个执行程序拷贝到系统可以寻找到的路径下,例如c:\winnt(windows2000系统),使它成为一个系统命令。

      在命令提示符窗口下使用方法如下(假定编译后的可执行文件为filesplitcon.exe):

      分割文件:

      filesplitcon s 要分割文件的文件名 分割成几个文件

      例如filesplitcon s w2ksp3.exe 4(将w2ksp3.exe分割成4个文件)



      合并文件:

      filesplitcon m 合并文件名



      代码很简洁,使用了streamwriter和streamreader对象,循环以byte字节的方式读取文件,第一个参数args[0]=“s”表示执行分割文件代码,args[0]=“m”表示执行合并文件代码。

      说明:

      分割时,在与分割文件相同目录下生成各个分割文件,文件名为原来文件名依次加上.1,.2,.3,.....;同时生成一个列表文件.list,记录生成的各分割文件的文件名;

      例如对于filesplitcon s w2ksp3.exe 4;生成了

      w2ksp3.exe.1

      w2ksp3.exe.2

      w2ksp3.exe.3

      w2ksp3.exe.4

      w2ksp3.exe.list

      w2ksp3.exe.list文件的内容是:

      w2ksp3.exe.1

      w2ksp3.exe.2

      w2ksp3.exe.3

      w2ksp3.exe.4



      合并时,将

      w2ksp3.exe.1

      w2ksp3.exe.2

      w2ksp3.exe.3

      w2ksp3.exe.4

      w2ksp3.exe.list

      5个文件拷贝到任一个目录下,执行命令:

      filesplitcon m w2ksp3.exe



      注意:如果一个文件不能恰好分割成等分的几个文件,以上程序的处理是将剩余的字节写入新的文件,所以对于以上示例的命令,若w2ksp3.exe不能恰好分成4个文件,那么将会生成5个文件,这样处理应该更接近于实际情况。

      以上程序在windows2000,visual studio
      .net开发环境下通过调试,因为使用了命令行方式,运行速度很快,将一个124M的文件分割为4个文件感觉不到等待的时间。
作者: telent     时间: 2006-12-14 08:29


  Quote:
Originally posted by tianzizhi at 2006-12-13 06:16 PM:
electronixtar兄说过了用下面的方法:

C:\WINDOWS\system32>fsutil.exe file setvaliddata
用法 : fsutil file setvaliddata <文件名> <数据长度>
例如 : fsutil file s ...

那能不能任意选择大小分割那?比如想将一个100M的文件分割成90M和10M
作者: tianzizhi     时间: 2006-12-14 09:28
告诉你几个dos下分割文件的程序,不过在网上很找到的,你有时间的话慢慢找一下吧,我也在找,现在还没找到,找到了会发上来的.
knife.exe
wjfg.exe
chopper.exe
cut、cutb,cutw
作者: tianzizhi     时间: 2006-12-14 09:44
先上传的好找的chopper
http://tianzizhi.disk365.cn  在dos软件里
作者: lxmxn     时间: 2006-12-14 13:44

  这个chopper.exe分隔出来的文件,除了文本文件,其它的好象无法使用。

作者: redtek     时间: 2006-12-14 23:14
还有一种简单的方法~:)
因为每台计算机上几乎都装了WinRAR 这个压缩工具:)
所以用它就行了~:)

原理:

) 用 WinRAR命令行方式 或是 图形界面直接操作方式选择“存储”方式压缩巨型电影文件。

) 在WinRAR中设定分割文件大小:
  在WinRAR中:分割文件大小的那地方填入你要截取的长度(字节)。

  1MB=1024KB
  1KB=1024个字节(B)
  90MB=90个1024KB

  所以计算90MB共有多少个字节就行了:
  90MB= 1024*1024*90 = 94371840

  用Windows计算器算,或是命令行算:
  
  C:\TEMP\demo>set /a 1024*1024*90
  94371840
  
) 然后压缩……
  不是就要90MB大小吗?(也就是说一个假如:260MB电影文件你只要前90MB就行了。
  所以,按照上面计算大小压缩你得到的第一个Rar压缩的文件就是那个90MB容量的文件。
  (不过,那个被分割的第一个文件还含有Rar文件头所占用的1MB容量)

) 分割的多余的那些删了!
  然后用rar再释放被以“存储”方式分割的第一个文件就行了。
  (不过,rar是不会让你释放的,因为它需要你提供第2个……等所有被分割出来的文件)
  
  所以,你就把被分割的第1个文件(那个90MB的)当成是一个被损址的压缩文件。
  然后用rar的 “  kb            继续释放损坏的文件” 这个命令释放就行了。

  (这样,你释放出来的那个文件的长度就是 89.90 MB ,所以你压缩之前计算好)

  (因为解压了,所以那个被分割的90MB的压缩文件的rar文件头信息自然被去掉了。


-----------------------------------
上面原理如果看着复杂,其实很简单,下面演示一下(命令行操作):

) 我有一个电影文件,260MB大小。
  2006-12-09  11:22       264,484,782 a.rmvb


) RAR无压缩方式分割它,按90MB分割。

  压缩命令:   C:\TEMP\demo>rar a /V92160K /M0  压缩后的文件名  a.rmvb

  
  C:\TEMP\demo>rar a /V92160K /M0  压缩后的文件名  a.rmvb
  
  RAR 3.00    版权 (c) 1993-2002 为 Eugene Roshal  所有   14 May 2002
  共享软件版本         键入 RAR -? 可获得帮助
  
  评估版,请注册。
  
  正在创建 压缩档案 压缩后的文件名.rar
  现在你得到第一个被分割的文件:
  
  2006-12-14  10:08        92,160,000 压缩后的文件名.part1.rar
  
) 然后释放被分割的第一个文件就行了。

  在释放第一个被分割的文件前想着先把多余的被分割出来的文件删掉。

  
  C:\TEMP\demo>rar x /KB  压缩后的文件名.part1.rar
  
  RAR 3.00    版权 (c) 1993-2002 为 Eugene Roshal  所有   14 Ma
  共享软件版本         键入 RAR -? 可获得帮助
  
  正在从 压缩后的文件名.part1.rar 中释放
  
  a.rmvb 已经存在,要覆盖它吗?
  [Y]-是, [N]-否, [A]-全部, [E]-从不, [R]-重命名, [Q]-退出 Y
  
  正在释放    a.rmvb
  找不到分卷 压缩后的文件名.part2.rar
  a.rmvb               - CRC 失败
  总计错误: 1
  
) 然后我打开这个被释放的电影文件,89.90MB,播放,电影播放正常~:)


) 上面是我的演示,为了演示清楚就罗嗦了点。
  但真正以上分割、翻放操作是非常简单的事情,一个RAR就搞定了,做成批处理更快:)



另:我没纯DOS下的RAR,所以试不了,有空儿楼主可以试一下。
作者: electronixtar     时间: 2006-12-15 00:26
还是 Redtek 的方法NB,顶一个
作者: a9319751     时间: 2006-12-15 01:54
支持下redtek
作者: ccwan     时间: 2006-12-15 02:03
redtek若不是加分狂,早已是金牌会员了。^_^