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