在线用户    站点地图 技术论坛 文档中心 站点导航 资源下载 语言参考 教程专题 站点统计 业务项目 使用帮助
您的位置
MSDN参考新加了CSS2参考,全中文,制作精良。245k下载。           新加了sxf_sxf推荐的"动态网页专家指导" 下载!          新加了lsg2002lsg推荐的"ASP.NET高级编程(PDF)" 下载!          新加了DHTML代码预览!!,功能强大哦!欢迎试用          新加了网友lincong为大家提供的SQL Server 2000 程序员指南,有点大,但同时也就说明内容全咯!           新加了网友ibra为大家提供的北大的JAVA课件,很适合初学者入门           新加了一个java的连接缓冲池代码示例           新加了人月神话电子版下载!软件工程巨著哦~~           更新了评分标准,引入了“专家分”概念,相信可以更好的激励大家的学习!详情请看“使用帮助”           新加了由网友GGG提供的“IIS超级管理手册”,值得一看哦!(虽然我没看过 :P )           新加了“英雄榜”,欢迎测试!           “无组件上传·从原理剖析到实践”已经全部完成,源码全部开放,有兴趣的朋友请到文档中心一探究竟。  您的位置  首页>文档中心>C#>文档A0000222 在同一窗口中打开页面中的链接 在新窗口中打开页面中的链接 将ASPCHINA设为首页 将ASPCHINA加入书签    
 LOGIN HERE
用户:
密码: 忘记密码
记住密码 用户注册 游客进入
相关文章

用C#创建Windows(NT)服务

C#完全手册

全面掌握VisualC#实现UDP协议

FileSystemObject组件新建\读取\添加\修改\删除功能实例

C# 关于Namespace一点介绍

C#的前途如何?

用Visual C#来操作Clipboard

三种禁用FileSystemObject组件的方法
发表文章
用C#设计一个命令行方式的文件分割器

原作者:godly     提交人:godly     发布时间:03-05-27     文章类型:转贴     浏览量:1691
参考链结:http://www.programfan.com/showarticle.asp?id=2227    
关键字:文件分割|C#|file
[本文档没有附件]
字体:    视力保护色: 杏仁黄  秋叶褐  胭脂红  芥末绿  天蓝  雪青  灰  银河白(默认色) [A0000222]

共享软件中有很多界面美观的文件分割程序,将一个大文件分割成几个较小的文件,分别保存,需要的时候再合并成原来的文件,常常是必备的工具。

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

关于这篇文章的评论 [注意:这里仅仅是给大家提供了一个发表对文章本身看法的地方,如果有疑问,请到论坛提出] 我要提问!
qweqwe        2009/12/29 11:22:00
:)
When you begin wow power leveling your blog the most important warcraft gold thing is having content which is unique, wow power leveling helpful, and well written. This is what will separate wow gold you from others within your niche and will keep people from coming back time and time again. Now it aion power leveling sounds easy to write a post each and every day, but from my aion gold personal experience around the third month is when I get really sick of writing and want a cheap wow power leveling break. Some of the different things I do when not wanting to post is write posts in advance. This can be very buy wow power leveling useful when you want to take a few days off.
hmfsmile        2003/6/2 18:15:00
调式通过!!!
标题
内容
发言
*您尚未以注册用户身份登录,不能发表评论。这里登录
您的位置
  (c)2000-2021 Yup Studio, all rights reserved.  
128.9063