
用backgroudworker实现大文件复制(备份).doc
4页用用 BackgroudWorker 实现大文件复制实现大文件复制(备份备份)这是我在一个项目做的一个视频文件备份功能,这里用 BackgroudWorker 实现大文件复制. 下面我主要的代码共享出来:private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e){if (backgroundWorker.CancellationPending){e.Cancel = true;e.Result = -1;return;}else{long totalSize = 0;List infoList = dgv_MediaList.DataSource as List;foreach (MediaInfo info in infoList){totalSize += info.FileSize;}foreach (MediaInfo info in infoList){e.Result = CopyFile(info.FullPath, Path.Combine(txt_BackupDir.Text, info.FileName), totalSize);}}}private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e){this.progress4Backup.Value = e.ProgressPercentage;}private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){btn_PauseBackup.Enabled = false;btn_StartBackup.Enabled = true;if (e.Result.ToString() == “-1“)MessageBox.Show(“备份中断!“);elseMessageBox.Show(“备份完成!“);}private void btn_PauseBackup_Click(object sender, EventArgs e){btn_PauseBackup.Enabled = false;btn_StartBackup.Enabled = true;backgroundWorker.CancelAsync();}private int CopyFile(string fromFile, string toFile, long totalLength){//创建一个文件流指向源文件FileStream fsRead = new FileStream(fromFile, FileMode.Open);//创建一个文件流指向目标文件FileStream fsWrite = new FileStream(toFile, 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){if (backgroundWorker.CancellationPending){fsRead.Close();fsWrite.Close();buffer = null;return -1;}//将前面已经读取到内存中的数据写入到文件中fsWrite.Write(buffer, 0, readLength);//已经读取的数量累加readCount += readLength;//计算已经读取的数据百分比int percentage = (int)(readCount * 100 / totalLength);backgroundWorker.ReportProgress(percentage);//进行下一次读取readLength = fsRead.Read(buffer, 0, buffer.Length);}fsRead.Close();fsWrite.Close();//清空缓冲区buffer = null;return 1;}。
