File Copy with Progress Bar

后端 未结 6 691
有刺的猬
有刺的猬 2020-11-27 02:58

I used this code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
using System.IO;

namespace Windo         


        
6条回答
  •  眼角桃花
    2020-11-27 03:37

    You need something like this:

        public delegate void ProgressChangeDelegate(double Persentage, ref bool Cancel);
        public delegate void Completedelegate();
    
        class CustomFileCopier
        {
            public CustomFileCopier(string Source, string Dest)
            {
                this.SourceFilePath = Source;
                this.DestFilePath = Dest;
    
                OnProgressChanged += delegate { };
                OnComplete += delegate { };
            }
    
            public void Copy()
            {
                byte[] buffer = new byte[1024 * 1024]; // 1MB buffer
                bool cancelFlag = false;
    
                using (FileStream source = new FileStream(SourceFilePath, FileMode.Open, FileAccess.Read))
                {
                    long fileLength = source.Length;
                    using (FileStream dest = new FileStream(DestFilePath, FileMode.CreateNew, FileAccess.Write))
                    {
                        long totalBytes = 0;
                        int currentBlockSize = 0;
    
                        while ((currentBlockSize = source.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            totalBytes += currentBlockSize;
                            double persentage = (double)totalBytes * 100.0 / fileLength;
    
                            dest.Write(buffer, 0, currentBlockSize);
    
                            cancelFlag = false;
                            OnProgressChanged(persentage, ref cancelFlag);
    
                            if (cancelFlag == true)
                            {
                                // Delete dest file here
                                break;
                            }
                        }
                    }
                }
    
                OnComplete();
            }
    
            public string SourceFilePath { get; set; }
            public string DestFilePath { get; set; }
    
            public event ProgressChangeDelegate OnProgressChanged;
            public event Completedelegate OnComplete;
        }
    

    Just run it in separate thread and subscribe for OnProgressChanged event.

提交回复
热议问题