天天看點

大檔案Copy

 private void button3_Click(object sender, EventArgs e)

        {

            Thread thread = null;

            //為了不讓界面死掉,要将該操作放在一個線程中

            thread = new Thread

                (

                () =>

                {

                    //告訴系統不去檢測非法的跨線程調用

                    CheckForIllegalCrossThreadCalls = false;

                    //建立一個檔案流指向源檔案

                    FileStream fsRead = new FileStream(this.textBox1.Text, FileMode.Open);

                    //建立一個檔案流指向目标檔案

                    FileStream fsWrite = new FileStream(this.textBox2.Text, FileMode.Create);

                    //記錄一下該檔案的長度

                    long fileLength = fsRead.Length;

                    //定義一個1M的緩沖區

                    byte[] buffer = new byte[1024 * 1024];

                    //先讀取一次,并且将讀取到的真正内容長度記錄下來

                    int readLength = fsRead.Read(buffer, 0, buffer.Length);

                    //用來記錄已經将多少内容寫入到了檔案中

                    long readCount = 0;

                    //隻要讀取到的内容不為0就接着讀

                    while (readLength!=0)

                    {

                        //将前面已經讀取到記憶體中的資料寫入到檔案中

                        fsWrite.Write(buffer ,0,readLength);

                        //已經讀取的數量累加

                        readCount += readLength;

                        //計算已經讀取的資料百分比

                        int percentage =(int)( readCount * 100 / fileLength);

                        this.progressBar1.Value = percentage;

                        //進行下一次讀取

                        readLength = fsRead.Read(buffer, 0, buffer.Length);

                    }

                    fsRead.Close();

                    fsWrite.Close();

                    //清空緩沖區

                    buffer = null;

                    //回收一下記憶體

                    GC.Collect();

                    thread.Abort();

                }

                );

            thread.Start();

        }