我正在使用将文件上传到ftp FtpWebRequest。我需要表明完成了多少工作。
FtpWebRequest
到目前为止,我的代码是:
public void Upload(string filename, string url) { FileInfo fileInf = new FileInfo(filename); string uri = "ftp://" + url + "/" + fileInf.Name; FtpWebRequest reqFTP; //string uri = "ftp://" + Host + "/public_html/testing/blogtest/" + fileInf.Name; // Create FtpWebRequest object from the Uri provided reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); // Provide the WebPermission Credintials reqFTP.Credentials = new NetworkCredential(Username, Password); // By default KeepAlive is true, where the control connection is not closed // after a command is executed. reqFTP.KeepAlive = false; //reqFTP.UsePassive = true; // Specify the command to be executed. reqFTP.Method = WebRequestMethods.Ftp.UploadFile; // Specify the data transfer type. reqFTP.UseBinary = true; // Notify the server about the size of the uploaded file reqFTP.ContentLength = fileInf.Length; // The buffer size is set to 2kb int buffLength = 2048; byte[] buff = new byte[buffLength]; int contentLen; // Opens a file stream (System.IO.FileStream) to read the file to be uploaded FileStream fs = fileInf.OpenRead(); // Stream to which the file to be upload is written Stream strm = reqFTP.GetRequestStream(); // Read from the file stream 2kb at a time contentLen = fs.Read(buff, 0, buffLength); // Till Stream content ends while (contentLen != 0) { // Write Content from the file stream to the FTP Upload Stream strm.Write(buff, 0, contentLen); contentLen = fs.Read(buff, 0, buffLength); } // Close the file stream and the Request Stream strm.Close(); fs.Close(); }
最简单的方法是使用BackgroundWorker代码并将其放入DoWork事件处理程序。并报告进度BackgroundWorker.ReportProgress。
BackgroundWorker
DoWork
BackgroundWorker.ReportProgress
基本思路:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { var ftpWebRequest = (FtpWebRequest)WebRequest.Create("ftp://example.com"); ftpWebRequest.Method = WebRequestMethods.Ftp.UploadFile; using (var inputStream = File.OpenRead(fileName)) using (var outputStream = ftpWebRequest.GetRequestStream()) { var buffer = new byte[1024 * 1024]; int totalReadBytesCount = 0; int readBytesCount; while ((readBytesCount = inputStream.Read(buffer, 0, buffer.Length)) > 0) { outputStream.Write(buffer, 0, readBytesCount); totalReadBytesCount += readBytesCount; var progress = totalReadBytesCount * 100.0 / inputStream.Length; backgroundWorker1.ReportProgress((int)progress); } } } private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar.Value = e.ProgressPercentage; }
确保WorkerReportsProgress已启用
WorkerReportsProgress
backgroundWorker2.WorkerReportsProgress = true;
有了BackgroundWorker您,您也可以轻松实现上传取消。