Example #1
0
        /// <summary>
        /// 下载文件
        /// </summary>
        /// <param name="remotefile">远程文件</param>
        /// <param name="localfile">本地文件</param>
        /// <param name="mode">端点续传模式</param>
        /// <returns></returns>
        public Int64 DownloadFile(String remotefile, String localfile, FtpTransportMode mode)
        {
            #region 准备工作
            if (String.IsNullOrEmpty(remotefile))
            {
                return(0);
            }
            if (String.IsNullOrEmpty(localfile))
            {
                var str = remotefile;
                if (str.Contains("/"))
                {
                    str = str.Substring(str.LastIndexOf("/") + 1);
                }
                localfile = str;
            }
            if (localfile[1] != Path.VolumeSeparatorChar)
            {
                localfile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, localfile);
            }

            if (File.Exists(localfile))
            {
                if (mode == FtpTransportMode.OverWrite)
                {
                    File.Delete(localfile);
                }
                else if (mode == FtpTransportMode.None)
                {
                    return(0);
                }
                //throw new Exception("目标文件已存在!");
            }
            #endregion

            var e = new LoadFileEventArgs();
            if (OnDownloadFile != null)
            {
                e.Cancel = false;
                e.Src    = remotefile;
                e.Des    = localfile;
                var fi = new FileInfo(localfile);
                if (fi != null && fi.Exists)
                {
                    e.DesSize = fi.Length;
                }

                OnDownloadFile(this, e);

                if (e.Cancel)
                {
                    return(0);
                }
            }

            try
            {
                #region  载
                var ftp = GetFtpRequest(remotefile);
                ftp.Method    = WebRequestMethods.Ftp.DownloadFile;
                ftp.UseBinary = true;

                if (!Directory.Exists(Path.GetDirectoryName(localfile)))
                {
                    Directory.CreateDirectory(Path.GetDirectoryName(localfile));
                }
                var fs = new FileStream(localfile, FileMode.OpenOrCreate, FileAccess.Write);
                //如果采用断点续传,则从断点处开始
                if (mode == FtpTransportMode.Append)
                {
                    //取远程文件大小
                    var size = GetFileSize(remotefile);
                    if (fs.Length >= size)
                    {
                        return(0);
                    }

                    //设置断点
                    ftp.ContentOffset = fs.Length;
                }

                var   buffer = new Byte[2048];
                Int64 count  = 0;
                using (var response = GetResponse(ftp))
                {
                    using (var responseStream = response.GetResponseStream())
                    {
                        try
                        {
                            var read = 0;
                            do
                            {
                                read   = responseStream.Read(buffer, 0, buffer.Length);
                                count += read;
                                fs.Write(buffer, 0, read);
                            } while (read != 0);
                        }
                        finally
                        {
                            fs.Close();
                            responseStream.Close();
                        }
                    }

                    response.Close();
                }
                e.SrcSize = count;
                return(count);

                #endregion
            }
            finally
            {
                if (OnDownloadFileFinished != null)
                {
                    var fi = new FileInfo(localfile);
                    if (fi != null && fi.Exists)
                    {
                        e.DesSize = fi.Length;
                    }

                    OnDownloadFileFinished(this, e);
                }
            }
        }
Example #2
0
        /// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="localfile">本地文件</param>
        /// <param name="remotefile">远程文件</param>
        /// <param name="mode">模式</param>
        /// <returns></returns>
        public Int64 UploadFile(String localfile, String remotefile, FtpTransportMode mode)
        {
            #region 准备工作
            if (String.IsNullOrEmpty(localfile))
            {
                throw new ArgumentNullException("localfile", "没有指定本地文件名。");
            }
            if (String.IsNullOrEmpty(remotefile))
            {
                throw new ArgumentNullException("remotefile", "没有指定远程文件名。");
            }

            if (localfile[1] != Path.VolumeSeparatorChar)
            {
                localfile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, localfile);
            }

            var fi = new FileInfo(localfile);
            if (!fi.Exists)
            {
                throw new Exception("本地文件不存在。");
            }

            //if (String.IsNullOrEmpty(remotefile)) remotefile = fi.Name;

            var e = new LoadFileEventArgs();
            if (OnUploadFile != null)
            {
                e.Cancel  = false;
                e.Src     = localfile;
                e.SrcSize = fi.Length;
                e.Des     = remotefile;

                OnUploadFile(this, e);

                if (e.Cancel)
                {
                    return(0);
                }
            }
            #endregion

            try
            {
                #region
                var ftp = GetFtpRequest(remotefile);
                ftp.Method    = WebRequestMethods.Ftp.UploadFile;
                ftp.UseBinary = true;

                var   buffer = new Byte[2048];
                Int64 size   = 0;
                using (var fs = fi.OpenRead())
                {
                    try
                    {
                        //如果采用断点续传,则从断点处开始
                        if (mode == FtpTransportMode.Append)
                        {
                            //取远程文件大小
                            var size2 = GetFileSize(remotefile);
                            if (fs.Length <= size2)
                            {
                                return(size2);
                            }

                            //设置断点
                            ftp.ContentOffset = size2;
                            fs.Position       = size2;
                        }

                        using (var rs = ftp.GetRequestStream())
                        {
                            Int32 dataRead;
                            do
                            {
                                dataRead = fs.Read(buffer, 0, buffer.Length);
                                size    += dataRead;
                                rs.Write(buffer, 0, dataRead);
                            } while (dataRead >= buffer.Length);
                            rs.Close();
                        }
                    }
                    finally
                    {
                        fs.Close();
                    }
                }
                e.DesSize = size;
                return(size);

                #endregion
            }
            finally
            {
                OnUploadFileFinished?.Invoke(this, e);
            }
        }