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类,等常用的文件操作、以及对线程的调用,

如果有不懂的地方,可以和我一块讨论

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值