public bool DownloadMp3File (DownloadedMp3 mp3) {
WebClient client = new WebClient();
string filePath = "";
bool wasDownload = false;
try {
string song = mp3.SongName;
filePath = @"mp3\" + song + ".mp3";
if (File.Exists (filePath)) {
File.Delete (filePath);
}
DateTime tryCountNow = DateTime.Now;
client = new WebClient();
client.DownloadFileAsync (new Uri (mp3.Url), filePath);
client.DownloadProgressChanged += client_DownloadProgressChanged;
client.DownloadFileCompleted += client_DownloadFileCompleted;
DateTime start = DateTime.Now;
bool notDownload = false;
downloadComplete = false;
while (!downloadComplete) {
DateTime now = DateTime.Now;
TimeSpan ts = now - start;
int min = ts.Minutes;
int sec = ts.Seconds;
if (10 < sec && 0 == downloadProgress) {
notDownload = true;
client.CancelAsync();
break;
}
if (min == 1) {
notDownload = true;
client.CancelAsync();
break;
}
Thread.Sleep (30);
}
if (!notDownload) {
client.CancelAsync();
client.OpenRead (mp3.Url);
int downloadedFileSize = Convert.ToInt32 (client.ResponseHeaders["Content-Length"]);
FileInfo localFile = new FileInfo (filePath);
if (localFile.Length == downloadedFileSize) {
wasDownload = true;
}
}
}
catch {
downloadProgress = 0;
downloadComplete = false;
}
finally {
client.CancelAsync();
client.Dispose();
downloadComplete = false;
downloadProgress = 0;
GC.Collect();
if (!wasDownload) {
if (File.Exists (filePath)) {
FileSecurity fs = File.GetAccessControl (filePath);
File.Delete (filePath);
}
}
Application.Current.Dispatcher.BeginInvoke (
DispatcherPriority.Background,
new Action (() =>
MainWindow.label3.Content = ""
));
}
return wasDownload;
}
Пожалуйста, помогите! Я иногда получаю это исключение:File.Delete процесс не может получить доступ к файлу, потому что он используется другим процессом
File.Delete процесс не может получить доступ к файлу, так как он используется другим процессом
Я не могу выяснить, почему (я ликвидировал WebClient).
Вы действительно не должны часто называть 'Dispose' сами. –
В вашем случае, что mp3-файл уже открыт кем-то другим или другим программным обеспечением. На try/catch, dispose, gc side, вы должны использовать ключевое слово, оно позаботится обо всем этом коде для вас. В блоке finally вы не должны делать ничего сложного lol. –
client.OpenRead довольно сомнительный. Код не является безопасным для исключений, исключение будет обходить вызов Dispose() и не будет производить никакой диагностики вообще. Ну, кроме «файл используется». –