2011-03-30 7 views
1

이 간단한 방법으로 파일 목록을 삭제할 수 있습니다. 그러나 몇 분 동안 파일을 삭제하지 않으면 몇 분 동안 파일을 삭제하지 못합니다. 특히 Interop를 사용하여 Word 문서를 병합 한 다음 병합을 실행 한 직후에 일부 파일에 대해 파일을 삭제하려고 시도 할 때 표시됩니다 (Word가 백그라운드에있는 것으로 추측 됨).C에서 파일을 삭제하는 방법 #

이 방법에 대한 접근 방법은 무엇입니까? 이 비동기하고는 잠시 후 파일을 삭제하기 시작 것 스레드 산란하게 (좀 가비지 컬렉터처럼?)를

public static void deleteDocuments(List<string> arrayList) { 
     foreach (var item in arrayList) { 
      try { 
       File.Delete(item); 
      } catch (Exception e) { 
       MessageBox.Show("Błąd kasowania: " + e.ToString(), "Błąd Kasowania", MessageBoxButtons.OK, MessageBoxIcon.Error); 

      } 
     } 
    } 

답변

1

을 나는이 질문에 유래에 있어야합니다 동의하지만 난에 cred하게이없는 그것을 움직여서 나는 가능한 답을 추가 할 것이고 그것이 넘어서 움직이면 아마 훨씬 더 좋은 답을 얻게 될 것입니다. 다음과 같이 할 수 있습니다.

public static void deleteDocuments(List<string> arrayList) 
{ 
    int maxRetries = 50; 
    foreach (var item in arrayList) 
    { 
     bool retry = false; 
     int retryCount = 0; 
     do 
     { 
      try 
      { 
       File.Delete(item); 
      } 
      catch(IOException ex) 
      { 
       // This indicates file is in use, so sleep for 
       // half second and retry 
       retryCount++; 
       if (retryCount < maxRetries) 
       { 
        System.Threading.Thread.Sleep(500); 
        retry = true; 
       } 
       else 
       { 
        MessageBox.Show("Błąd kasowania: " + e.ToString(), 
         "Błąd Kasowania", MessageBoxButtons.OK, 
         MessageBoxIcon.Error); 
       } 
      } 
      catch (Exception e) 
      { 
       MessageBox.Show("Błąd kasowania: " + e.ToString(), 
        "Błąd Kasowania", MessageBoxButtons.OK, 
        MessageBoxIcon.Error); 
      } 
     } 
     while(retry) 
    } 
} 
+0

이렇게하면 파일이 삭제 될 때까지 스레드가 차단됩니다. 파일이 항상 잠겨 있으면 어떻게됩니까? 나는 카운터를 추가하여 파일을 삭제할 최대 시도를 제안합니다. –

+0

당신 말이 맞습니다. 나는 그것을 빨리 썼으며 그 모든 것을 생각하지 않았습니다. 내 자신의 코드에서 나는 이런 일을 한 번씩해야만한다. 재시도 횟수에 제한을 둔다. 나는 코드를 편집 할 것이다. – pstrjds

+0

여전히 파일 목록이 길고 파일을 삭제하기 위해 대기하는 방해물이 하나있는 경우 GUI가 응답하지 않게됩니다. – MadBoy

관련 문제