web client DownloadFileCompleted get file name

泄露秘密 提交于 2019-12-01 16:42:31

问题


I tried to download file like this:

WebClient _downloadClient = new WebClient();

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

// ...

And after downloading I need to start another process with download file, I tried to use DownloadFileCompleted event.

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

But, i cannot know name of downloaded file from AsyncCompletedEventArgs , I made my own

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

    public DownloadCompliteEventArgs(string name) 
    {
        fileName = name;
    }
}

But I cannot understand how call my event instead DownloadFileCompleted

Sorry if it's nood question


回答1:


One way is to create a closure.

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

Which means your DownloadFileCompleted needs to return the event handler.

        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);
        }

The reason I create the variable called _filename is so that the filename variable passed into the DownloadFileComplete method is captured and stored in the closure. If you didn't do this you wouldn't have access to the filename variable within the closure.




回答2:


I was playing around DownloadFileCompleted to get the file path/file name From the event. I've tried the above solution also but It was not like my expectation then i fond the solution by adding Querystring value, Here i would like to share the code with you.

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);

And the event can be defined as like this:

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


来源:https://stackoverflow.com/questions/13917009/web-client-downloadfilecompleted-get-file-name

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!