gpt4 book ai didi

c# - FtpWebRequest FTP 下载与 ProgressBar

转载 作者:行者123 更新时间:2023-11-30 23:10:37 25 4
gpt4 key购买 nike

我的代码有效,但 ProgressBar 直接跳到 100%,下载将继续。完成后会出现一个消息框来获取信息。

我已经更改了缓冲区大小,但没关系。

我在这里做错了什么?

这是我的代码:

void workerDOWN_DoWork(object sender, DoWorkEventArgs e)
{
string fileFullPath = e.Argument as String;
string fileName = Path.GetFileName(fileFullPath);
string fileExtension = Path.GetExtension(fileName);

label4.Invoke((MethodInvoker)delegate { label4.Text = "Downloading File.."; });

string ftpServerIP = "XXX";
string ftpUserName = "XXX";
string ftpPassword = "XXX";

try
{
//Datei vom FTP Server downloaden
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://" + ftpServerIP + "/" + fileName);
request.Credentials = new NetworkCredential(ftpUserName, ftpPassword);
request.Method = WebRequestMethods.Ftp.DownloadFile;
using (Stream ftpStream = request.GetResponse().GetResponseStream())
using (Stream fileStream = File.Create(fileFullPath))
{
var buffer = new byte[32 * 1024];
int totalReadBytesCount = 0;
int readBytesCount;
while ((readBytesCount = ftpStream.Read(buffer, 0, buffer.Length)) > 0)
{
fileStream.Write(buffer, 0, readBytesCount);
totalReadBytesCount += readBytesCount;
var progress = (int)((float)totalReadBytesCount / (float)fileStream.Length * 100);
workerDOWN.ReportProgress((int)progress);
label3.Invoke((MethodInvoker)delegate { label3.Text = progress + " %"; });
}
}
}
catch (WebException ex)
{
FtpWebResponse response = (FtpWebResponse)ex.Response;

if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
{
MessageBox.Show("Datei nicht gefunden!", "Error");
}
}
e.Result = fileFullPath;
}


void workerDOWN_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
string fileFullPath = e.Result as String;
string fileName = Path.GetFileName(fileFullPath);

MessageBox.Show("Download erfolgreich!","Information");

progressBar1.Value = 0;
label3.Invoke((MethodInvoker)delegate { label3.Text = " "; });
label4.Invoke((MethodInvoker)delegate { label4.Text = " "; });
}

最佳答案

使用带有 WinForms 进度条的 FtpWebRequest FTP 下载的简单示例:

private void button1_Click(object sender, EventArgs e)
{
// Run Download on background thread
Task.Run(() => Download());
}

private void Download()
{
try
{
const string url = "ftp://ftp.example.com/remote/path/file.zip";
var credentials = new NetworkCredential("username", "password");

// Query size of the file to be downloaded
WebRequest sizeRequest = WebRequest.Create(url);
sizeRequest.Credentials = credentials;
sizeRequest.Method = WebRequestMethods.Ftp.GetFileSize;
int size = (int)sizeRequest.GetResponse().ContentLength;

progressBar1.Invoke(
(MethodInvoker)(() => progressBar1.Maximum = size));

// Download the file
WebRequest request = WebRequest.Create(url);
request.Credentials = credentials;
request.Method = WebRequestMethods.Ftp.DownloadFile;

using (Stream ftpStream = request.GetResponse().GetResponseStream())
using (Stream fileStream = File.Create(@"C:\local\path\file.zip"))
{
byte[] buffer = new byte[10240];
int read;
while ((read = ftpStream.Read(buffer, 0, buffer.Length)) > 0)
{
fileStream.Write(buffer, 0, read);
int position = (int)fileStream.Position;
progressBar1.Invoke(
(MethodInvoker)(() => progressBar1.Value = position));
}
}
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}

enter image description here

核心下载代码基于:
Upload and download a file to/from FTP server in C#/.NET


解释为什么你的代码不起作用:

  • 您正在使用目标文件的大小进行计算:fileStream.Length – 它将始终等于 totalReadBytesCount,因此 progress 永远是 100。
  • 您可能打算使用 ftpStream.Length,但无法读取。
  • 基本上使用 FTP 协议(protocol),您不知道正在下载的文件的大小。如果你需要知道它,你必须在下载之前明确地查询它。为此,我使用了 WebRequestMethods.Ftp.GetFileSize

关于c# - FtpWebRequest FTP 下载与 ProgressBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45269263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com