public void Start() { string folderName = ""; lock (FtpWorker.FileQueue) { folderName = MakeDir(); } BackupFileInfo fi = null; while (true) { fi = FtpWorker.FileQueue.Dequeue(); if (StartUpload != null) { StartUpload(Id, (int)(fi.File.Length / (1024))); } CurrentFileWorkingSize = 0; UploadFile(fi, this.StoragePath, folderName); // lock (FtpWorker.FileQueue) // { if (FtpWorker.FileQueue.Count == 0) { break; } // } } }
private bool UploadFile(BackupFileInfo file, string rootPath, string folderName) { FileStream fileStream = File.OpenRead(file.File.FullName); string uri = string.Format("{3}/{2}/{0}-{1}", file.File.CreationTime.ToString("yyyyMMddhhmmssfff"), BitConverter.ToString(Encoding.UTF8.GetBytes(file.File.Name), 0).Replace("-", "") + file.File.Extension, folderName, this.RemoteFolder); Stream s = null; try { Request = (FtpWebRequest)FtpWebRequest.Create(uri); if (User != null && Pwd != null) { Request.Credentials = new NetworkCredential(User, Pwd); } Request.Method = WebRequestMethods.Ftp.UploadFile; Request.UseBinary = true; Request.Timeout = 5000; Request.ReadWriteTimeout = 5000; Request.ContentLength = fileStream.Length; s = Request.GetRequestStream(); byte[] buffer = new byte[1024 * 1024 * 1]; int realRead = 0; while ((realRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) { s.Write(buffer, 0, realRead); CurrentFileWorkingSize += realRead; if (SingleProgressUpdate != null) { SingleProgressUpdate(Id, CurrentFileWorkingSize / 1024); } if (ProgressUpdate != null) { ProgressUpdate(realRead); } } s.Close(); Request.GetResponse().Dispose(); if (this.Uploaded != null) { this.Uploaded(file.File.Name); } if (this.DeleteByBackup) { file.File.Delete(); if (this.LocalFileDeleted != null) { this.LocalFileDeleted(file.File.Name); } } return(true); } catch (Exception e) { if (file.RetryCount == 5) { if (this.UploadFailed != null) { this.UploadFailed(file.File.Name, e.Message); } } else { FtpWorker.FileQueue.Enqueue(file); } return(false); } finally { fileStream.Dispose(); } }