Web 客户端下载文件已完成获取文件名



我尝试下载这样的文件:

WebClient _downloadClient = new WebClient();
_downloadClient.DownloadFileCompleted += DownloadFileCompleted;
_downloadClient.DownloadFileAsync(current.url, _filename);
// ...
下载

后,我需要使用下载文件启动另一个进程,我尝试使用DownloadFileCompleted事件。

void DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
    if (e.Error != null)
    {
        throw e.Error;
    }
    if (!_downloadFileVersion.Any())
    {
        complited = true;
    }
    DownloadFile();
}

但是,我无法知道从AsyncCompletedEventArgs下载文件的名称,我自己做了

public class DownloadCompliteEventArgs: EventArgs
{
    private string _fileName;
    public string fileName
    {
        get
        {
            return _fileName;
        }
        set
        {
            _fileName = value;
        }
    }
    public DownloadCompliteEventArgs(string name) 
    {
        fileName = name;
    }
}

但我不明白如何称呼我的事件而不是DownloadFileCompleted

对不起,如果是面条问题

一种方法是创建一个闭包。

WebClient _downloadClient = new WebClient();        
_downloadClient.DownloadFileCompleted += DownloadFileCompleted(_filename);
_downloadClient.DownloadFileAsync(current.url, _filename);

这意味着您的 DownloadFileDone 需要返回事件处理程序。

public AsyncCompletedEventHandler DownloadFileCompleted(string filename)
{
    Action<object, AsyncCompletedEventArgs> action = (sender, e) =>
    {
        var _filename = filename;
        if (e.Error != null)
        {
            throw e.Error;
        }
        if (!_downloadFileVersion.Any())
        {
            complited = true;
        }
        DownloadFile();
    };
    return new AsyncCompletedEventHandler(action);
}

我创建名为 _filename 的变量的原因是,传递给 DownloadFileComplete 方法的文件名变量被捕获并存储在闭包中。如果不这样做,您将无法访问闭包中的文件名变量。

我正在玩DownloadFileCompleted从事件中获取文件路径/文件名。我也尝试了上述解决方案,但这不像我的期望,然后我喜欢通过添加查询字符串值来解决该解决方案,在这里我想与您分享代码。

string fileIdentifier="value to remember";
WebClient webClient = new WebClient();
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler (DownloadFileCompleted);
webClient.QueryString.Add("file", fileIdentifier); // here you can add values
webClient.DownloadFileAsync(new Uri((string)dyndwnldfile.path), localFilePath);

事件可以定义如下:

 private void DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
 {
     string fileIdentifier= ((System.Net.WebClient)(sender)).QueryString["file"];
     // process with fileIdentifier
 }

相关内容

  • 没有找到相关文章

最新更新