2014-11-12 2 views
0
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).

+0

Вы действительно не должны часто называть 'Dispose' сами. –

+0

В вашем случае, что mp3-файл уже открыт кем-то другим или другим программным обеспечением. На try/catch, dispose, gc side, вы должны использовать ключевое слово, оно позаботится обо всем этом коде для вас. В блоке finally вы не должны делать ничего сложного lol. –

+0

client.OpenRead довольно сомнительный. Код не является безопасным для исключений, исключение будет обходить вызов Dispose() и не будет производить никакой диагностики вообще. Ну, кроме «файл используется». –

ответ

1

Ваш код подсказывает, что вы получаете исключение «файл, используемый» в файле, который был недавно загружен. Многие антивирусные программы автоматически сканируют вновь созданные и/или недавно загруженные файлы и могут задерживать закрытие дескриптора файла до тех пор, пока сканирование не будет выполнено.

Если это ваша проблема, вы больше не сможете закрыть файл вовремя. Вы можете переключиться на другой антивирус, который не сохраняет файлы во время сканирования, или вы можете реализовать цикл задержки + повтора при попытке использовать недавно закрывшийся файл.

+0

Похоже, что это был антивирус. Благодаря! – user2660012

Смежные вопросы

 Смежные вопросы