中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 用DOS命令如何截短一个大文件?
作者:
标题: 用DOS命令如何截短一个大文件? 上一主题 | 下一主题
telent
初级用户





积分 30
发帖 9
注册 2006-12-12
状态 离线
『楼 主』:  用DOS命令如何截短一个大文件?

比如将一个100M的文件截短为90M,截掉的10M就不要了。

2006-12-14 06:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 2 楼』:  


  先汗一个。

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


2006-12-14 06:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
a9319751
中级用户





积分 439
发帖 170
注册 2006-1-9
状态 离线
『第 3 楼』:  

我也想知道,网上下的电视剧每集都有序幕和结束的字幕,如果能批处理掉就好了,可以连放了



bat c c++
2006-12-14 06:52
查看资料  发送邮件  发短消息 网志  OICQ (5040366)  编辑帖子  回复  引用回复
tianzizhi
高级用户




积分 622
发帖 214
注册 2006-9-22
状态 离线
『第 4 楼』:  

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个文件感觉不到等待的时间。

2006-12-14 07:16
查看资料  发送邮件  发短消息 网志  OICQ (419503077)  编辑帖子  回复  引用回复
telent
初级用户





积分 30
发帖 9
注册 2006-12-12
状态 离线
『第 5 楼』:  



  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

2006-12-14 08:29
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tianzizhi
高级用户




积分 622
发帖 214
注册 2006-9-22
状态 离线
『第 6 楼』:  

告诉你几个dos下分割文件的程序,不过在网上很找到的,你有时间的话慢慢找一下吧,我也在找,现在还没找到,找到了会发上来的.
knife.exe
wjfg.exe
chopper.exe
cut、cutb,cutw

2006-12-14 09:28
查看资料  发送邮件  发短消息 网志  OICQ (419503077)  编辑帖子  回复  引用回复
tianzizhi
高级用户




积分 622
发帖 214
注册 2006-9-22
状态 离线
『第 7 楼』:  

先上传的好找的chopper
http://tianzizhi.disk365.cn  在dos软件里

2006-12-14 09:44
查看资料  发送邮件  发短消息 网志  OICQ (419503077)  编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 8 楼』:  


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


2006-12-14 13:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 9 楼』:  

还有一种简单的方法~:)
因为每台计算机上几乎都装了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,所以试不了,有空儿楼主可以试一下。

   此帖被 +3 点积分       点击查看详情   
评分人:【 a9319751 分数: +3  时间:2006-12-15 01:54




    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-12-14 23:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
electronixtar
铂金会员





积分 7493
发帖 2672
注册 2005-9-2
状态 离线
『第 10 楼』:  

还是 Redtek 的方法NB,顶一个




C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
2006-12-15 00:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
a9319751
中级用户





积分 439
发帖 170
注册 2006-1-9
状态 离线
『第 11 楼』:  

支持下redtek



bat c c++
2006-12-15 01:54
查看资料  发送邮件  发短消息 网志  OICQ (5040366)  编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 12 楼』:  

redtek若不是加分狂,早已是金牌会员了。^_^



三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2006-12-15 02:03
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: