程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#版TXT文本分割器

C#版TXT文本分割器

編輯:C#入門知識

哈!老師實驗要求要做文件分割器的,這裡先做個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類,等常用的文件操作、以及對線程的調用,

如果有不懂的地方,可以和我一塊討論

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved