`
net_liu
  • 浏览: 232710 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

文件的分割下载

阅读更多
 HttpFile类:
public class HttpFile
    {
        public Form1 formm;
        public int threadh;//线程代号
        public string filename;//文件名
        public string strUrl;//接收文件的URL
        public FileStream fs;
        public HttpWebRequest request;
        public System.IO.Stream ns;
        public byte[] nbytes;//接收缓冲区
        public int nreadsize;//接收字节数

        public HttpFile(Form1 form, int thread)//构造方法
        {
            formm = form;
            threadh = thread;
        }
        public HttpFile()//析构方法
        {
            formm.Dispose();
        }

        public void receive()//接收线程
        {
            filename = formm.filenamew[threadh];
            strUrl = formm.strurl;
            ns = null;
            nbytes = new byte[512];
            nreadsize = 0;
            fs = new FileStream(filename, System.IO.FileMode.Create);
            try
            {
                request = (HttpWebRequest)HttpWebRequest.Create(strUrl);
                //接收的起始位置及接收的长度 
                request.AddRange(formm.filestartw[threadh],
                formm.filestartw[threadh] + formm.filesizew[threadh]);
                ns = request.GetResponse().GetResponseStream();//获得接收流
                nreadsize = ns.Read(nbytes, 0, 512);
                while (nreadsize > 0)
                {
                    fs.Write(nbytes, 0, nreadsize);
                    nreadsize = ns.Read(nbytes, 0, 512);
                }
                fs.Close();
                ns.Close();
            }
            catch (Exception er)
            {
                string message=(er.Message);
                fs.Close();
            }
            formm.threadw[threadh] = true;
        }
    }

 

窗体代码:

        public bool[] threadw; //每个线程结束标志
        public string[] filenamew;//每个线程接收文件的文件名
        public int[] filestartw;//每个线程接收文件的起始位置
        public int[] filesizew;//每个线程接收文件的大小
        public string strurl;//接受文件的URL
        public bool hb;//文件合并标志
        public int thread;//进程数 


        /// <summary>
        /// 下载
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            lblMessage.Text = "正在下载...";
            strurl = textBox2.Text.Trim().ToString();
            WebRequest request;
            long filesize = 0;
            try
            {
                request = (HttpWebRequest)HttpWebRequest.Create(strurl);
                filesize = request.GetResponse().ContentLength;//取得目标文件的长度
                request.Abort();
            }
            catch (Exception er)
            {
                MessageBox.Show(er.Message);
            }
            // 接收线程数
            thread = Convert.ToInt32(textBox4.Text.Trim().ToString(), 10);
            //根据线程数初始化数组
            threadw = new bool[thread];
            filenamew = new string[thread];
            filestartw = new int[thread];
            filesizew = new int[thread];

            //计算每个线程应该接收文件的大小
            int filethread = (int)filesize / thread;//平均分配
            int filethreade = filethread + (int)filesize % thread;//剩余部分由最后一个线程完成
            //为数组赋值
            for (int i = 0; i < thread; i++)
            {
                threadw[i] = false;//每个线程状态的初始值为假
                filenamew[i] = i.ToString() + ".dat";//每个线程接收文件的临时文件名
                if (i < thread - 1)
                {
                    filestartw[i] = filethread * i;//每个线程接收文件的起始点
                    filesizew[i] = filethread - 1;//每个线程接收文件的长度
                }
                else
                {
                    filestartw[i] = filethread * i;
                    filesizew[i] = filethreade - 1;
                }
            }
            //定义线程数组,启动接收线程
            Thread[] threadk = new Thread[thread];
            HttpFile[] httpfile = new HttpFile[thread];
            for (int j = 0; j < thread; j++)
            {
                httpfile[j] = new HttpFile(this, j);
                threadk[j] = new Thread(new ThreadStart(httpfile[j].receive));
                threadk[j].Start();
            }
            //启动合并各线程接收的文件线程
            Thread hbth = new Thread(new ThreadStart(hbfile));
            hbth.Start();
        }


        /// <summary>
        /// 合并的方法
        /// </summary>
        public void hbfile()
        {
            if (this.InvokeRequired)
            {
                while (true)//等待
                {
                    hb = true;
                    for (int i = 0; i < thread; i++)
                    {
                        if (threadw[i] == false)//有未结束线程,等待
                        {
                            hb = false;
                            Thread.Sleep(100);
                            break;
                        }
                    }
                    if (hb == true)//所有线程均已结束,停止等待,
                    {
                        break;
                    }
                }
                FileStream fs;//开始合并
                FileStream fstemp;
                int readfile;
                byte[] bytes = new byte[512];
                fs = new FileStream(textBox3.Text.Trim().ToString(), System.IO.FileMode.Create);
                for (int k = 0; k < thread; k++)
                {
                    fstemp = new FileStream(filenamew[k], System.IO.FileMode.Open);
                    while (true)
                    {
                        readfile = fstemp.Read(bytes, 0, 512);
                        if (readfile > 0)
                        {
                            fs.Write(bytes, 0, readfile);
                        }
                        else
                        {
                            break;
                        }
                    }
                    fstemp.Close();
                }
                fs.Close();
                this.lblMessage.Invoke(new ThreadStart(Show) );
            }
        }
        private void Show()
        {
            lblMessage.Text = "下载完成。";
        }

 

分享到:
评论

相关推荐

    文件分割工具(日志分割)

    "文件分割工具(日志分割)"就是专门针对这种情况设计的,它能够有效地将大的日志文件拆分成多个小文件,便于管理和操作。 日志文件通常是应用程序或系统运行过程中的记录,包含了关于错误、警告、调试信息等关键...

    C#文件分割源码(顶)

    6. **文件合并**:与文件分割相对应,文件合并是将多个小文件重新组合成原始大文件的过程。这同样需要使用到FileStream和缓冲区,但这次是从多个源文件中读取数据,并写入到一个目标文件中。 现在,让我们来看一下...

    RAR压缩文件分割器

    RAR压缩文件分割器是一款工具,专门用于处理大体积的RAR压缩文件,将其分割成多个较小的部分,便于管理和传输。在日常工作中,我们可能会遇到需要发送或存储超大文件的情况,这时RAR文件的分割功能就显得尤为实用。...

    文件分割(js脚本).rar

    标题 "文件分割(js脚本).rar" 暗示了这是一个使用JavaScript编写的文件分割工具。JavaScript,简称JS,是一种广泛应用于网页和网络应用的编程语言,尤其在客户端的前端开发中占据主导地位。它允许开发者在用户浏览器...

    java实现文件的分割.rar

    在Java编程中,文件分割是一项常见的任务,尤其在大数据处理、网络传输或存储优化时显得尤为重要。本示例“java实现文件的分割.rar”提供的SplitFile程序,利用了Java的随机访问流(RandomAccessFile)来实现文件的...

    文件分割器 好用 下载版

    文件分割器文件分割器文件分割器下载后谢谢我吧

    windows 文件分割工具

    4. 网络传输:大文件通过网络传输可能导致速度慢或失败,分割后可以加快上传下载速度。 四、选择文件分割工具的考虑因素 1. 支持的文件格式:不同的工具支持不同的文件类型,确保工具能处理你需要分割的文件类型。 ...

    txt 文件分割器 txt 文件分割器

    txt 文件分割器txt 文件分割器txt 文件分割器txt 文件分割器txt 文件分割器txt 文件分割器txt 文件分割器txt 文件分割器txt 文件分割器txt 文件分割器txt 文件分割器txt 文件分割器txt 文件分割器

    下载资源文件合并与分割软件大文件分割精灵 V1.6

    《大文件分割精灵 V1.6:高效管理大型数据的利器》 在信息化时代,大文件的处理成为了许多用户和企业面临的问题。无论是传输、存储还是备份,大文件都可能带来诸多不便。这时,一款优秀的文件分割与合并工具就显得...

    快刀文件分割 文件分割

    3. 共享与分发:在团队协作中,如果需要共享一个大文件,可以先将其分割,让每个成员下载一部分,然后再进行合并,这样可以减少单个人的下载压力。 三、操作流程 1. 下载与安装:首先,从可靠渠道获取名为"kdfg....

    文件分割器 Visual C++

    【文件分割器 Visual C++】是一个专门为了解决移动存储设备容量限制问题而设计的工具。在日常工作中,我们可能经常遇到大文件无法一次性复制到容量较小的移动设备(如U盘、移动硬盘)上的情况。文件分割器通过将大...

    CSV大文件分割工具.rar

    它提供了一个直观的界面,让用户可以轻松选择要分割的CSV文件和希望的分割行数。例如,如果你知道Excel能处理的最大行数,你可以设置这个值,工具会自动将CSV文件按照设定的行数分割成多个小文件,以便于逐个处理或...

    WIN10文件分割合并

    "大文本分割器"标签表明这个软件特别适用于处理文本文件,但通常也能处理其他类型的文件,如视频、音频或文档。在Windows 10中,有多种方法可以实现文件分割,包括使用内置功能和第三方软件。 内置的Windows资源...

    sql文件分割工具 可以快速分割

    sql 资源分割文件 迅速

    C#大文件分割成若干小文件源码

    一个将大文件分割秤多个小文件的小例子。 有此类需求的朋友可以参考。 使用VS2010编译。

    文件分割器用于分割文件

    文件分割器是一种实用工具,主要用于将大文件分解成较小的部分,以便于管理和传输。在现代数字生活中,我们经常遇到文件过大无法直接发送或上传的情况,这时文件分割器就能发挥重要作用。它可以帮助用户轻松地将一个...

    xsplit超强文件分割器

    3. 网络传输:分割大文件可以加快上传和下载速度,尤其在网络条件不稳定的情况下。 4. 共享与备份:分割文件能简化共享过程,也可以使备份操作更加灵活。 总结,XSplit作为一款高效的文件分割工具,为用户处理大...

    vue实现文件分割与合并

    在Vue.js框架中,文件的分割与合并是一个常见的需求,特别是在处理大文件上传、分片下载或分布式存储等场景。本文将深入探讨如何利用Vue.js实现这一功能。 首先,我们需要理解文件分割的基本概念。文件分割是指将一...

Global site tag (gtag.js) - Google Analytics