2014-11-12 3 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를 프로세스가 파일을 액세스 할 수 없습니다 : 나는 가끔 예외를 얻을.

+0

당신은 정말로 자주 자신을 '배출'해서는 안됩니다. –

+0

MP3 파일이 이미 다른 사람이나 다른 프로그램에서 열어 놓은 경우에 사용하십시오. try/catch, dispose, gc 측에서 키워드를 사용하면 모든 코드가 처리됩니다. 마침내 당신은 아무것도 복잡한 일을해서는 안됩니다. –

+0

client.OpenRead는 꽤 의문의 여지가 있습니다. 이 코드는 예외 안전이 아니며, 예외는 Dispose() 호출을 우회하여 전혀 진단을 생성하지 않습니다. 음, "파일이 사용 중"이 아닌 것. –

답변

1

코드에서 새로 다운로드 한 파일에 "파일 사용 중"예외가 표시됩니다. 많은 안티 바이러스 프로그램은 새로 생성되거나 새로 다운로드 된 파일을 자동으로 검사하므로 검사가 완료 될 때까지 파일 핸들 닫기를 지연시킬 수 있습니다.

문제가 있다면 시간이 지나면 파일을 닫을 수있는 방법이 없습니다. 검사 중에 파일을 잠근 상태로 유지하지 않는 다른 바이러스 백신으로 전환하거나 최근에 닫은 파일을 사용하려고 시도 할 때 지연 + 재 시도 루프를 구현할 수 있습니다.

+0

바이러스 백신처럼 보입니다. 감사! – user2660012