你每次读取500K-1M字节,就这么循环下不就行了

解决方案 »

  1.   

    namespace MainCopySys
    {    public delegate void Complete(bool state);
        public delegate void ProcessBoxChange(int persent);    public class FileCopy
        {
            private string sourceFile;        public string SourceFile
            {
                get { return sourceFile; }
                set { sourceFile = value; }
            }
            private string destFile;        public string DestFile
            {
                get { return destFile; }
                set { destFile = value; }
            }        private FileStream dest;
            private FileStream source;        private AsyncCallback call;        public Complete ReportResult;        /// <summary>
            /// 进度条数据
            /// </summary>        private int percent = 0;
            public ProcessBoxChange ProcessChanged;        /// <summary>
            /// 作为缓冲区
            /// </summary>
            private byte[] buffer;        /// <summary>
            /// 带参构造器
            /// </summary>
            /// <param name="sourceFile"></param>
            /// <param name="destFile"></param>
            public FileCopy(string sourceFile, string destFile)
            {        }
            /// <summary>
            /// 无参构造器
            /// </summary>
            public FileCopy()
                : this(string.Empty, string.Empty)
            {        }        /// <summary>
            /// 同步复制
            /// </summary>
            public void SynCopy()
            {
                try
                {
                    source = new FileStream(SourceFile, FileMode.Open);
                    dest = new FileStream(DestFile, FileMode.Create);
                    //对源流的字节块进行百分比转换确保每行都能转换采用数学的Ceiling方法
                    int length = (int)Math.Ceiling((double)source.Length / 100);
                    buffer = new byte[length];                //对源流字节写入缓冲区的数据
                    int len = 0;
                    while ((len = source.Read(buffer, 0, length)) > 0)
                    {
                        //反读缓冲区
                        dest.Write(buffer, 0, len);
                    }
                    if (ReportResult != null)
                    {
                        ReportResult(true);
                    }
                }
                catch
                {
                    if (ReportResult != null)
                    {
                        ReportResult(false);
                    }
                }
                finally
                {
                    source.Close();
                    dest.Close();
                }
            }
            /// <summary>
            /// 异步复制
            /// </summary>
            public void AsynCopy()
            {
                source = new FileStream(SourceFile, FileMode.Open, FileAccess.Read, FileShare.Read, 5000, true);
                dest = new FileStream(DestFile, FileMode.Create);
                int len = (int)Math.Ceiling((double)source.Length / 100);
                buffer = new byte[len];
                //委托的初始化参数表中使用“方法名”
                call = new AsyncCallback(CallBack);
                source.BeginRead(buffer, 0, buffer.Length, call, null);
            }        /// <summary>
            /// 实现相应异步操作完成时的状态
            /// </summary>
            /// <param name="ir">接口异步操作状态</param>
            private void CallBack(IAsyncResult ir)
            {
                int count = source.EndRead(ir);
                if (count > 0)
                {
                    dest.Write(buffer, 0, count);                if (ProcessChanged != null)
                    {
                        ProcessChanged(++percent);
                    }                source.BeginRead(buffer, 0, buffer.Length, call, null);
                }
                else
                {
                    dest.Close();
                    source.Close();
                }
            }
        }
    }此代码需要怎么改进呢 ?