C#版TXT文本分割器
?????????? 哈!老師實驗要求要做文件分割器的,這里先做個demo出來和大家分享下。
?????????? 這是實驗要求:1. 能進行文件分割
??????????????????????????????????? 2. 分割塊大小由用戶輸入決定
??????????????????????????????????? 3. 能進行文件合并
??????????????????????????????????? 4. 文件分割與合并過程用線程來實現
??????????????????????????????????? 5 . 數據緩沖區不得超過2K
??????????????????????????????????? 6. 要有處理進度顯示
?????????? 文本分割器的原理很簡單,就是將一個較長的文本分割成指定大小的文本塊,可以方便數據量較大的文本的移動。
?????????? 主要是用到FileStream、StreamReader、StreamWriter對文件進行讀取、創建等操作。
下面就開始進入主題:先截個圖前臺界面如下:
界面布局如上,同時還需要一個OpenFileDialog控件,用于打開選擇文件。
主要操作:
先聲明一下幾個全局變量:
?????? FileStream srcFileStream;//要將要分割的文件流
??????? int fenGeKuaiDaXiao,wenBenChangDu;//分割塊大小、文件長度
????????FileInfo f;//選中的文件
1、選擇分割文件:
代碼:
private void btntextliulan_Click(object sender, EventArgs e)
??????? {
??????????? try{
??????????? if (openFileDialog1.ShowDialog() == DialogResult.OK)
??????????? {
??????????????? openFileDialog1.Filter = "所有文件(*.txt)|*.txt";
??????????????? openFileDialog1.InitialDirectory = "D:\\";//默認打開D盤
??????????????? f = new FileInfo(openFileDialog1.FileName);//實例化f,即選中的文件
??????????????? txtfengewenjian.Text = f.FullName;//顯示選中的文件的全路徑
??????????????? srcFileStream = new FileStream(f.FullName, FileMode.Open, FileAccess.Read);//實例化并打開分割的文件流
??????????????? StreamReader streamReader = new StreamReader(srcFileStream);
????????????????txtfengewenjian.Text = f.FullName;
??????????????? srcFileStream = new FileStream(f.FullName, FileMode.Open, FileAccess.Read);
??????????????? wenBenChangDu = (int)f.Length/ 1024 ;
??????????????? txtwenjiandaxiao.Text = wenBenChangDu.ToString();//顯示文件長度
??????????????? }
??????????? }
??????????? catch
??????????? {
??????????????? MessageBox.Show("請確保輸入的分割數字正確!");
??????????? }
??????? }
2、選中要分割的文件,確認無誤后,分割:
//分割按鈕click事件處理代碼
?? private void btnfenge_Click(object sender, EventArgs e)
??????? {
??????????? int fenGeKuaiShu;//分割塊數
??????????? fenGeKuaiDaXiao = Convert.ToInt32(txtfengekuaidaxiao.Text);//分割塊大小
??????????? if (wenBenChangDu % fenGeKuaiDaXiao > 0)//如果文件長度剛好能整除分割塊大小則分割塊數=文件長度/分割塊大小,否則分割塊數=文件長度/分割塊大小+1;
??????????? {
??????????????? fenGeKuaiShu = wenBenChangDu / fenGeKuaiDaXiao + 1;
??????????? }
??????????? else
??????????? {
??????????????? fenGeKuaiShu = wenBenChangDu / fenGeKuaiDaXiao;
??????????? }
??????????? for (int i = 0; i < fenGeKuaiShu; i++)//因為要求要用多線程來進行文件的分割、合并的,所以這里調用新的線程
??????????? {
??????????????? Thread thread = new Thread(new ParameterizedThreadStart(FenGeBaoCun));//線程的參數為ParameterizedThreadStart類型的實例,ParameterizedTheadStart的參數是一個函數名,即線程將要調用的函數,如果函數是無參函數,則直接啟動線程即可,如果是單參函數則在start()函數中傳入參數,如果是多參函數,則對多參數封裝成類,傳遞類對象即可,此處為單參
??????????????? thread.Start(i);
??????????? }
??????????? MessageBox.Show("分割成功");
??????????? txtfengekuaidaxiao.Text = "";
??????????? txtfengewenjian.Text = "";
??????????? txtwenjiandaxiao.Text = "";
??????????? srcFileStream.Close();?? //關閉要分割的文件流
??????? }
線程調用函數:
?? public void FenGeBaoCun(object i)
??????? {
??????????????? using (FileStream fenGeFileStream = new FileStream(f.FullName.Substring(0,f.FullName.Length-f.Extension.Length)+i+f.Extension, FileMode.OpenOrCreate, FileAccess.Write))//新建文件流按照指定的塊數分割文件,//這里默認的是保存在和源文件同一目錄下,也可以自己另行保存
??????????????? {
??????????????????? int data = 0;
??????????????????
??????????????????? byte[] buffer = new byte[fenGeKuaiDaXiao*1024];
??????????????????????? if ((data = srcFileStream.Read(buffer, 0, buffer.Length)) > 0)
??????????????????????? {
??????????????????????????? BinaryWriter bw = new BinaryWriter(fenGeFileStream, Encoding.Default);
??????????????????????????? bw.Write(buffer, 0, data);
??????????????????????? }
??????????????????????? else
??????????????????????? {
??????????????????????????? MessageBox.Show("信息未讀入");
??????????????????????? }
??????????? }
?????????
??????? }
至此,文件分割已經完畢。
下邊進行文件的合并:
首先選擇第一個分割文件,然后輸入要合并的塊數:
?FileStream heBingFile;//新建的將要合并的文件流
??????? FileInfo f1;//用來保存選中要合并的文件對象
??????? private void btnxuanzefengewenjian_Click(object sender, EventArgs e)
??????? {
??????????? if (openFileDialog1.ShowDialog() == DialogResult.OK)
??????????? {
??????????????? txtfengewenjian.Text = openFileDialog1.FileName;
??????????????? f1 = new FileInfo(openFileDialog1.FileName);
??????????????? txthebingwenjian.Text = f1.FullName;
??????????????? heBingFile = new FileStream(f1.FullName.Substring(0,f1.FullName.Length-f1.Extension.Length-1)+f1.Extension, FileMode.Create, FileAccess.Write);//實例化合并的文件流對象,默認保存在和分割文件一個文件夾下??????
??????????? }
??????? }
輸入要合并的文件塊數進行合并:
?private void btnhebing_Click(object sender, EventArgs e)
??????? {
??????????? try
??????????? {
??????????????? int count = Convert.ToInt32(txthebingwenjianshu.Text);
??????????????? for (int i = 0; i < count; i++)//和分割文件一樣,調用線程進行合并
??????????????? {
??????????????????? Thread thread = new Thread(new ParameterizedThreadStart(HeBing));
??????????????????? thread.Start(i);
??????????????? }
??????????????? MessageBox.Show("合并成功");
??????????????? txthebingwenjian.Text = "";
??????????????? heBingFile.Close();
??????????? }
??????????? catch
??????????? {
??????????????? MessageBox.Show("合并異常,請檢查后重新合并");
??????????? }
??????? }
執行合并函數
public void HeBing(object i)
??????? {
??????????? int data = 0;
??????????? string filepath = f1.FullName.Substring(0, f1.FullName.Length - f1.Extension.Length - 1) + i + f1.Extension;
??????????? FileStream fengeStream = new FileStream(filepath, FileMode.Open, FileAccess.Read);
??????????? byte[] buffer = new byte[fengeStream.Length];
??????????? if ((data = fengeStream.Read(buffer, 0, buffer.Length)) > 0)
??????????? {
??????????????? BinaryWriter bw = new BinaryWriter(heBingFile);
??????????????? bw.Write(buffer, 0, data);
??????????? }
??????????? else
??????????? {
??????????????? MessageBox.Show("合并失敗");
??????????? }
??????? }
?
?
至此已經合并完畢。
這個demo實現了txt文本文件的分割,實驗要求的是文件的分割,其實都差不多的。
我會馬上做出文件分割,和大家分享的。
希望這個東西能對大家有所幫助,這里邊主要用到了FileStream的讀取、FileInfo類,等常用的文件操作、以及對線程的調用,
如果有不懂的地方,可以和我一塊討論
總結
以上是生活随笔為你收集整理的C#版TXT文本分割器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 玩转oracle 11g(7):导出导入
- 下一篇: emacs c语言 自动补全,Emacs