2014-12-22 2 views
5

요약 삭제하는 동안 :액세스 거부 .exe 파일을 문제의

을 나는 새 위치, 로컬 드라이브에 비해 많은 폴더와 파일을 복사 한 후, 그 다음 특정 파일/폴더를 삭제, 콘솔 응용 프로그램을 . 이 파일 형식 중 하나는 .exe 파일입니다. 삭제하려고 할 때 그것이 나에게 거부 액세스 오류를 제공 파일에게 말했다

기타 참고 사항 (다른 파일과 폴더의 종류뿐만 아니라 삭제하는 동안이 발생합니다). 나는 몇 가지 질문을보고

등을 Unable to delete .exe file through c#. 그러나 로컬 컴퓨터 나 복사 원본에서 프로세스가 실행되지 않았습니다. 저는 도메인의 로컬 관리자이자 도메인 관리자이며, 함께 일하는 디렉토리의 모든 폴더와 파일에 대한 소유권을 가졌습니다. 하지만 여전히 코드에서 파일을 삭제하려고 할 때 액세스가 거부됩니다. 내가 수동으로 이러한 파일/폴더를 삭제하지만 수 있어요 (키 삭제 클릭)

문제 :. 나는 "이 삭제 나에게 액세스를 거부하는이 문제를 과거 얻을 수있는 방법을 찾고 있어요 위에 언급 한 바와 같이

불법 "파일 형식을 내 코드에서 삭제하십시오.

내 코드는 : 어떤 도움을 크게 감상 할 수

#region Delete_Illegal_Items 
    public static void RemoveIllegalItems() 
    { 
     Console.Clear(); 
     DirectoryInfo Libraries = new DirectoryInfo(Library.DestinationMain); 
     try 
     { 
      foreach (var Lib in Libraries.GetDirectories()) 
      { 
       Console.WriteLine("Working On {0}.", Lib.Name); 
       Parallel.Invoke(
         () => 
         { 
          RemoveBadFiles(Lib); 
         }, 

         () => 
         { 
          DeleteEmptyFolders(Lib); 
         } 
        ); 
      } 
     } 
     catch (AggregateException e) 
     { 
      Console.WriteLine("There Was An Unusual Error During Initialization Of Library Correction:\n{0}", e.InnerException.ToString()); 
     } 
    } 

    private static string[] BadFiles = { 
             @".hta", 
             @".exe", 
             @".lnk", 
             @".tmp", 
             @".config", 
             @".ashx", 
             @".hta.", 
             @".hta::$DATA", 
             @".zip", 
             @".asmx", 
             @".json", 
             @".soap", 
             @".svc", 
             @".xamlx", 
             @".msi", 
             @".ops", 
             @".pif", 
             @".shtm", 
             @".shtml", 
             @"smt", 
             @".vb", 
             @".vbe", 
             @".vbs", 
             @".ds_store", 
             @".db", 
             @".ini", 
             @".tiff" 
             }; 
    private static void RemoveBadFiles(DirectoryInfo directory) 
    { 
     DirectoryInfo[] dirs = null; 
     FileInfo[] files = null; 
     if (directory != null) 
     { 
      files = directory.GetFiles(); 
     } 

     try 
     { 
      dirs = directory.GetDirectories(); 
     } 
     catch (IOException) { } 
     catch (Exception e) 
     { 
      Console.WriteLine("\nError During Enumeration Of Items To Delete:\n{0}", e.Message); 
     } 

     if (files != null) 
     { 
      foreach (var file in files) 
      { 
       try 
       { 
        if (file.IsReadOnly) 
        { 
         file.IsReadOnly = false; 
        } 

        if (BadFiles.Contains(Path.GetExtension(file.FullName))) 
        { 
         File.Delete(file.FullName); 
        } 
       } 
       catch (Exception e) 
       { 
        Console.WriteLine("\nError During Removal Or Illegal Files:\n" + e.Message); 
       } 
      } 
     } 

     if (dirs != null) 
     { 
      foreach (var dir in dirs) 
      { 
       switch (dir.Name) 
       { 
        case ".TemporaryItems": 
         { 
          try 
          { 
           Directory.Delete(dir.FullName); 
          } 
          catch { } 
          break; 
         } 
        case "AI_RecycleBin": 
         { 
          try 
          { 
           Directory.Delete(dir.FullName); 
          } 
          catch { } 
          break; 
         } 
        case ".ToRemove": 
         { 
          try 
          { 
           Directory.Delete(dir.FullName); 
          } 
          catch { } 
          break; 
         } 
        default: 
         { 
          break; 
         } 
       } 
       RemoveBadFiles(dir); 
      } 
     } 
    } 

    private static void DeleteEmptyFolders(DirectoryInfo directory) 
    { 
     Program Main = new Program(); 
     try 
     { 
      DirectoryInfo[] dirs = directory.GetDirectories(); 

      foreach (var subDirectory in dirs) 
      { 
       int sum = Library.CountLibrary(subDirectory.FullName); 

       if (sum == 0) 
       { 
        Directory.Delete(subDirectory.FullName); 
       } 

       DeleteEmptyFolders(subDirectory); 
      } 
     } 
     catch { } 
    } 
    #endregion 

(업데이트). 이 질문에 다른 곳에서 직접 대답 한 적이 있다면 의견에 자유롭게 언급하십시오. 위에서 언급했듯이 나는이 문제에 관한 과거의 질문을 검토해 왔으며 아직 해결책을 찾지 못했습니다. 그렇지 않으면 도움을 주셔서 감사합니다.

+0

콘솔 응용 프로그램 사용자가 시스템에서 실행하는 권한은 무엇입니까? 콘솔 앱에서이 파일을 만들고 있습니까? –

+0

저 아래서 실행 중입니다. 파일이 네트워크 파일 공유에서 로컬 관리자 권한이있는 로컬 드라이브로 복사되고 있습니다. 또한 파일 셰어와 로컬 컴퓨터는 모두 도메인 아래에있는 모든 것에 대해 전체 읽기/쓰기 권한을 가진 도메인 내에 있습니다. 아무 것도 만들지 않고 복사 된 데이터에서 복사 한 다음 삭제합니다. – CalebB

+0

어떤 줄에서 예외가 발생합니까? 이것은 어떤 파일 또는 특정 파일에만 적용됩니까? – dymanoid

답변

1

파일을 "읽기 전용"으로 표시 했으므로 파일을 삭제하기 전에 if 문을 추가하여 필요한 경우 표시를 제거하는 것이 문제였습니다. 다음은 원하는 모든 파일을 삭제하는 데 성공한 코드입니다.

#region Delete_Illegal_Items 
    public static void RemoveIllegalItems() 
    { 
     Console.Clear(); 
     DirectoryInfo Libraries = new DirectoryInfo(Library.DestinationMain); 
     try 
     { 
      foreach (var Lib in Libraries.GetDirectories()) 
      { 
       Console.WriteLine("Working On {0}.", Lib.Name); 
       Parallel.Invoke(
         () => 
         { 
          RemoveBadFiles(Lib); 
         }, 

         () => 
         { 
          DeleteEmptyFolders(Lib); 
         } 
        ); 
      } 
     } 
     catch (AggregateException e) 
     { 
      Console.WriteLine("There Was An Unusual Error During Initialization Of Library Correction:\n{0}", e.InnerException.ToString()); 
     } 
    } 

    private static string[] BadFiles = { 
             @".hta", 
             @".exe", 
             @".lnk", 
             @".tmp", 
             @".config", 
             @".ashx", 
             @".hta.", 
             @".hta::$DATA", 
             @".zip", 
             @".asmx", 
             @".json", 
             @".soap", 
             @".svc", 
             @".xamlx", 
             @".msi", 
             @".ops", 
             @".pif", 
             @".shtm", 
             @".shtml", 
             @"smt", 
             @".vb", 
             @".vbe", 
             @".vbs", 
             @".ds_store", 
             @"ds_store", 
             @"._.Trashes", 
             @".Trashes", 
             @".db", 
             @".dat", 
             @".sxw", 
             @".ini", 
             @".tif", 
             @".tiff" 
             }; 
    private static void RemoveBadFiles(DirectoryInfo directory) 
    { 
     DirectoryInfo[] dirs = null; 
     FileInfo[] files = null; 
     if (directory != null) 
     { 
      try 
      { 
       files = directory.GetFiles(); 
      } 
      catch (IOException) { } 
     } 

     try 
     { 
      dirs = directory.GetDirectories(); 
     } 
     catch (IOException) { } 
     catch (Exception e) 
     { 
      Console.WriteLine("\nError During Enumeration Of Items To Delete:\n{0}", e.Message); 
     } 

     if (files != null) 
     { 
      foreach (var file in files) 
      { 
       try 
       { 
        if (file.IsReadOnly) 
        { 
         file.IsReadOnly = false; 
        } 

        if (BadFiles.Contains(Path.GetExtension(file.FullName)) || BadFiles.Contains(file.Name)) 
        { 
         File.Delete(file.FullName); 
        } 
       } 
       catch (Exception e) 
       { 
        Console.WriteLine("\nError During Removal Or Illegal Files:\n" + e.Message); 
       } 
      } 
     } 

     if (dirs != null) 
     { 
      foreach (var dir in dirs) 
      { 
       switch (dir.Name) 
       { 
        case ".TemporaryItems": 
         { 
          try 
          { 
           Directory.Delete(dir.FullName); 
          } 
          catch { } 
          break; 
         } 
        case "TemporaryItems": 
         { 
          try 
          { 
           Directory.Delete(dir.FullName); 
          } 
          catch { } 
          break; 
         } 
        case "AI_RecycleBin": 
         { 
          try 
          { 
           Directory.Delete(dir.FullName); 
          } 
          catch { } 
          break; 
         } 
        case ".ToRemove": 
         { 
          try 
          { 
           Directory.Delete(dir.FullName); 
          } 
          catch { } 
          break; 
         } 
        default: 
         { 
          break; 
         } 
       } 
       RemoveBadFiles(dir); 
      } 
     } 
    } 

    private static void DeleteEmptyFolders(DirectoryInfo directory) 
    { 
     Program Main = new Program(); 
     try 
     { 
      DirectoryInfo[] dirs = directory.GetDirectories(); 

      foreach (var subDirectory in dirs) 
      { 
       int sum = Library.CountLibrary(subDirectory.FullName); 

       if (sum == 0) 
       { 
        Directory.Delete(subDirectory.FullName); 
       } 

       DeleteEmptyFolders(subDirectory); 
      } 
     } 
     catch { } 
    } 
    #endregion 

의견을 보내 주신 분들께 감사드립니다. 그리고 이것이 앞으로 다른 사람들을 도울 수 있기를 바랍니다.

+0

'BadFiles'을'HashSet '으로 만드는 것을 고려하십시오. 'HashSet.Contains'는'Array.Contains'보다 훨씬 빠릅니다. 'HashSet.Contains'는 순차 검색보다는 직접 검색을합니다. 제한 요소는 디스크 I/O 시간이기 때문에이 응용 프로그램의 런타임 속도에는 아무런 차이가 없지만 일반적으로 좋은 방법입니다. –

+0

그 점을 분명히 들여다. 팁을 가져 주셔서 감사합니다. – CalebB