【发布时间】:2018-04-25 07:35:11
【问题描述】:
我有一个包含 DirectAdmin 用户备份列表的 ListBox。列表使用WebRequestMethods.Ftp.ListDirectory 填充,如下所示:
我可以使用右下角的按钮下载档案。当我单击该按钮时,会出现另一个表单并下载存档。
我的下载代码是这样的:
public static void DownloadFile(string server, string username, ...)
{
Uri URI = new Uri($"ftp://{server}/{targetFilePath}");
using (WebClient client = new WebClient())
{
client.Credentials = new NetworkCredential(username, password);
if (progress != null)
{
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(progress);
}
if (complete != null)
{
client.DownloadFileCompleted += new AsyncCompletedEventHandler(complete);
}
before?.Invoke();
client.DownloadFileAsync(URI, localFilePath);
}
}
这就是我为DownloadProgressChanged 事件传递给DownloadFile() 方法的内容:
delegate (object s2, DownloadProgressChangedEventArgs e2)
{
TransferLabel.Invoke((MethodInvoker)delegate
{
TransferLabel.Text = $"{(e2.BytesReceived / 1024).ToString()} KB / {(e2.TotalBytesToReceive / 1024).ToString()} KB";
});
TransferProgressBar.Invoke((MethodInvoker)delegate
{
TransferProgressBar.Value = (int)(e2.BytesReceived / (float)e2.TotalBytesToReceive * 100);
});
}
我正在使用同样的方法上传文件,它工作正常,但下载e2.TotalBytesToReceive 在整个过程中返回-1:
只有当它完成时,我才能得到正确的值:
这是为什么呢?
我找到了解决问题的方法。我会将 ListBox 更改为 ListView,并使用 ListDirectoryDetails 存储档案的文件大小。这样我就可以将e.BytesReceived 与存储的总字节数进行比较,而不是e.TotalBytesToReceive。这将解决我的问题,但我仍然对这个问题感到好奇。为什么我会收到-1?我做错了什么,还是与服务器相关的问题?还有什么我可以做的来解决它(得到正确的值)?
【问题讨论】:
-
阅读备注> 此处注意部分:msdn.microsoft.com/en-us/library/…