C# 如何使用FtpWebRequest显示上传进度条
我正在使用C# 如何使用FtpWebRequest显示上传进度条,c#,winforms,ftp,progress-bar,ftpwebrequest,C#,Winforms,Ftp,Progress Bar,Ftpwebrequest,我正在使用FtpWebRequest将文件上载到ftp。我需要显示完成了多少工作的状态 到目前为止,我的代码是: public void Upload(string filename, string url) { FileInfo fileInf = new FileInfo(filename); string uri = "ftp://" + url + "/" + fileInf.Name; FtpWebRequest reqFTP; //string uri
FtpWebRequest
将文件上载到ftp。我需要显示完成了多少工作的状态
到目前为止,我的代码是:
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
报告进度
基本思想是:
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
backgroundWorker2.WorkerReportsProgress = true;
使用
BackgroundWorker
您还可以轻松实现上传取消 请参阅,它允许您在GUI仍然响应的情况下运行耗时的任务,并提供进度/取消功能。一个简单的FTP上载示例,使用FtpWebRequest
和WinForms进度条,使用:
核心上传代码基于:一种可取消的方法,使用异步/等待模式的IProgress接口,如果可用,利用。请参阅以确定您的场景是否符合条件。在打开流之前检查取消令牌,但在传输文件时,会将取消令牌卸载到流的异步方法 我很少做基准测试,但我怀疑这只在发送大文件时才实用。使用重叠I/O的性能可能会随着较小的文件,尤其是较小的缓冲区大小而降低
公共异步任务FtpAsync(字符串源文件、Uri destinationUri、字符串用户、SecureString密码、IProgress进程、CancellationToken令牌)
{
const int bufferSize=128*1024;//128kb缓冲区
进度报告(0米);
var request=(FtpWebRequest)WebRequest.Create(destinationUri);
request.Method=WebRequestMethods.Ftp.UploadFile;
request.Credentials=新的网络凭据(用户、密码);
token.ThrowIfCancellationRequested();
使用(var fileStream=newfilestream(sourceFile,FileMode.Open,FileAccess.Read,FileShare.Read,bufferSize,true))
{
使用(var ftpStream=await request.GetRequestStreamAsync())
{
var buffer=新字节[bufferSize];
int-read;
而((read=await fileStream.ReadAsync(buffer,0,buffer.Length,token))>0)
{
等待ftpStream.WriteAsync(缓冲区,0,读取,令牌);
变量百分比=100m*((十进制)fileStream.Position/fileStream.Length);
进度报告(百分比);
}
}
}
var response=(FtpWebResponse)等待请求。GetResponseAsync();
var success=(int)response.StatusCode>=200&(int)response.StatusCode<300;
response.Close();
如果(!成功)
抛出新异常(response.StatusDescription);
}
是的,但解决方案不太好上传3mb文件显示只有23%53,然后100@Afnan你可以根据自己的需要调整缓冲区的大小。这是一个只有边界链接的答案。您应该扩展您的答案,在此处包含尽可能多的信息,并使用该链接仅供参考。
private void button1_Click(object sender, EventArgs e)
{
// Run Upload on background thread
Task.Run(() => Upload());
}
private void Upload()
{
string url = "ftp://ftp.example.com/remote/path/file.zip";
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.UploadFile;
using (Stream fileStream = File.OpenRead(@"C:\local\path\file.zip"))
using (Stream ftpStream = request.GetRequestStream())
{
progressBar1.Invoke(
(MethodInvoker)delegate {
progressBar1.Maximum = (int)fileStream.Length; });
byte[] buffer = new byte[10240];
int read;
while ((read = fileStream.Read(buffer, 0, buffer.Length)) > 0)
{
ftpStream.Write(buffer, 0, read);
progressBar1.Invoke(
(MethodInvoker)delegate {
progressBar1.Value = (int)fileStream.Position; });
}
}
}