Web client DownloadFileCompleted получить имя файла



Я попытался загрузить файл следующим образом:



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



Извините, если это вопрос nood

654   2  

2 ответов:

Один из способов-создать замыкание.

        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, заключается в том, что переменная filename, переданная в метод DownloadFileComplete, захватывается и сохраняется в закрытии. Если бы вы этого не сделали, у вас не было бы доступа к переменной filename в закрытии.

Я играл вокруг 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
 }

Comments

    Ничего не найдено.