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