用C#設計一個命令行方式的文件分割器
2024-07-21 02:20:27
供稿:網友
共享軟件中有很多界面美觀的文件分割程序,將一個大文件分割成幾個較小的文件,分別保存,需要的時候再合并成原來的文件,常常是必備的工具。
本文用微軟的visual studio .net開發(fā)環(huán)境的c#語言也來設計一個文件分割器,并且以dos命令行方式運行,就象使用copy命令一樣簡單。從中也可以了解文件分割的原理以及.net框架對文件的讀寫操作方式。
新建一個visual c#項目,選擇“控制臺應用程序”,項目名稱設置為filesplitcon,系統自動產生了class1.cs文件,將以下的代碼加入到class1.cs的相應區(qū)域中:
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下生成了可執(zhí)行文件,大小只有6.5kb,將這個執(zhí)行程序拷貝到系統可以尋找到的路徑下,例如c:/winnt(windows2000系統),使它成為一個系統命令。
在命令提示符窗口下使用方法如下(假定編譯后的可執(zhí)行文件為filesplitcon.exe):
分割文件:
filesplitcon s 要分割文件的文件名 分割成幾個文件
例如filesplitcon s w2ksp3.exe 4(將w2ksp3.exe分割成4個文件)
合并文件:
filesplitcon m 合并文件名
代碼很簡潔,使用了streamwriter和streamreader對象,循環(huán)以byte字節(jié)的方式讀取文件,第一個參數args[0]=“s”表示執(zhí)行分割文件代碼,args[0]=“m”表示執(zhí)行合并文件代碼。
說明:
分割時,在與分割文件相同目錄下生成各個分割文件,文件名為原來文件名依次加上.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個文件拷貝到任一個目錄下,執(zhí)行命令:
filesplitcon m w2ksp3.exe
注意:如果一個文件不能恰好分割成等分的幾個文件,以上程序的處理是將剩余的字節(jié)寫入新的文件,所以對于以上示例的命令,若w2ksp3.exe不能恰好分成4個文件,那么將會生成5個文件,這樣處理應該更接近于實際情況。
以上程序在windows2000,visual studio .net開發(fā)環(huán)境下通過調試,因為使用了命令行方式,運行速度很快,將一個124m的文件分割為4個文件感覺不到等待的時間。