Web客户端DownloadFileCompleted获取文件名

时间:2012-12-17 15:27:28

标签: c# event-handling webclient

我尝试下载这样的文件:

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

对不起,如果这是个问题

2 个答案:

答案 0 :(得分:17)

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

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

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

        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方法的文件名变量并将其存储在闭包中。如果你没有这样做,你就无法访问闭包中的filename变量。

答案 1 :(得分:3)

我正在玩DownloadFileCompleted以获取文件路径/文件名。我也试过上面的解决方案,但这不像我的期望那么我喜欢添加Querystring值的解决方案,在这里我想与你分享代码。

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
 }