<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      用C#設計一個命令行方式的文件分割器

      [摘要]共享軟件中有很多界面美觀的文件分割程序,將一個大文件分割成幾個較小的文件,分別保存,需要的時候再合并成原來的文件,常常是必備的工具。 本文用微軟的visual studio .net開發環境...
           共享軟件中有很多界面美觀的文件分割程序,將一個大文件分割成幾個較小的文件,分別保存,需要的時候再合并成原來的文件,常常是必備的工具。

           本文用微軟的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個文件感覺不到等待的時間。


      日韩精品一区二区三区高清