用C#設(shè)計(jì)一個(gè)命令行方式的文件分割器
發(fā)表時(shí)間:2023-08-21 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]共享軟件中有很多界面美觀的文件分割程序,將一個(gè)大文件分割成幾個(gè)較小的文件,分別保存,需要的時(shí)候再合并成原來(lái)的文件,常常是必備的工具。 本文用微軟的visual studio .net開(kāi)發(fā)環(huán)境...
共享軟件中有很多界面美觀的文件分割程序,將一個(gè)大文件分割成幾個(gè)較小的文件,分別保存,需要的時(shí)候再合并成原來(lái)的文件,常常是必備的工具。
本文用微軟的visual studio .net開(kāi)發(fā)環(huán)境的C#語(yǔ)言也來(lái)設(shè)計(jì)一個(gè)文件分割器,并且以DOS命令行方式運(yùn)行,就象使用copy命令一樣簡(jiǎn)單。從中也可以了解文件分割的原理以及.net框架對(duì)文件的讀寫(xiě)操作方式。
新建一個(gè)visual c#項(xiàng)目,選擇“控制臺(tái)應(yīng)用程序”,項(xiàng)目名稱設(shè)置為filesplitcon,系統(tǒng)自動(dòng)產(chǎn)生了class1.cs文件,將以下的代碼加入到class1.cs的相應(yīng)區(qū)域中:
using System;
using System.Data;
using System.IO;
namespace filesplitcon
{
/// <summary>
/// Class1 的摘要說(shuō)明。
/// </summary>
class Class1
{
/// <summary>
/// 應(yīng)用程序的主入口點(diǎn)。
/// </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("文件分割結(jié)束");
}
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("文件合并結(jié)束");
}
}
}
}
編譯后,在bin/debug下生成了可執(zhí)行文件,大小只有6.5kb,將這個(gè)執(zhí)行程序拷貝到系統(tǒng)可以尋找到的路徑下,例如c:\winnt(windows2000系統(tǒng)),使它成為一個(gè)系統(tǒng)命令。
在命令提示符窗口下使用方法如下(假定編譯后的可執(zhí)行文件為filesplitcon.exe):
分割文件:
filesplitcon s 要分割文件的文件名 分割成幾個(gè)文件
例如filesplitcon s w2ksp3.exe 4(將w2ksp3.exe分割成4個(gè)文件)
合并文件:
filesplitcon m 合并文件名
代碼很簡(jiǎn)潔,使用了streamwriter和streamreader對(duì)象,循環(huán)以byte字節(jié)的方式讀取文件,第一個(gè)參數(shù)args[0]=“s”表示執(zhí)行分割文件代碼,args[0]=“m”表示執(zhí)行合并文件代碼。
說(shuō)明:
分割時(shí),在與分割文件相同目錄下生成各個(gè)分割文件,文件名為原來(lái)文件名依次加上.1,.2,.3,.....;同時(shí)生成一個(gè)列表文件.list,記錄生成的各分割文件的文件名;
例如對(duì)于filesplitcon s w2ksp3.exe 4;生成了
w2ksp3.exe.1
w2ksp3.exe.2
w2ksp3.exe.3
w2ksp3.exe.4
w2ksp3.exe.list
w2ksp3.exe.list文件的內(nèi)容是:
w2ksp3.exe.1
w2ksp3.exe.2
w2ksp3.exe.3
w2ksp3.exe.4
合并時(shí),將
w2ksp3.exe.1
w2ksp3.exe.2
w2ksp3.exe.3
w2ksp3.exe.4
w2ksp3.exe.list
5個(gè)文件拷貝到任一個(gè)目錄下,執(zhí)行命令:
filesplitcon m w2ksp3.exe
注意:如果一個(gè)文件不能恰好分割成等分的幾個(gè)文件,以上程序的處理是將剩余的字節(jié)寫(xiě)入新的文件,所以對(duì)于以上示例的命令,若w2ksp3.exe不能恰好分成4個(gè)文件,那么將會(huì)生成5個(gè)文件,這樣處理應(yīng)該更接近于實(shí)際情況。
以上程序在windows2000,visual studio .net開(kāi)發(fā)環(huán)境下通過(guò)調(diào)試,因?yàn)槭褂昧嗣钚蟹绞,運(yùn)行速度很快,將一個(gè)124M的文件分割為4個(gè)文件感覺(jué)不到等待的時(shí)間。