2014-12-22 25 views
5

Sommario di problema:Accesso negato durante l'eliminazione del file exe

ho una console app che, dopo aver copiato molte cartelle e file su una nuova posizione, un'unità locale, che quindi elimina alcuni file/cartelle . Uno di questi tipi di file che elimina è file .exe. Quando si tenta di eliminare i file ha detto che mi dà un errore di accesso negato (Questo si verifica anche durante il tentativo di eliminare altri tipi di file e cartelle, nonché)

Altre note:.

ho visto parecchie domande, come ad esempio come Unable to delete .exe file through c#. Tuttavia, il processo non è mai stato in esecuzione sul mio computer locale né sull'origine da cui è stato copiato. Sono sia un amministratore locale che un amministratore di dominio nel nostro dominio e ho avuto la proprietà di tutte le cartelle e i file nelle directory con cui lavoro. Ma continua a negarmi l'accesso quando provo a cancellare il file dal codice. Sono comunque in grado di eliminare tali file/cartelle manualmente (clicca eliminare la chiave)

Problema:.

come detto in precedenza Sto cercando un modo per superare questo problema mi ha negato l'accesso per eliminare questi " Tipi di file "non validi" e cancellarli dal mio codice.

My Code: (Aggiornato)

#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 

Qualsiasi aiuto sarebbe molto apprezzato. Se questa domanda è stata direttamente risposta altrove, non esitare a menzionarla nel commento. Come ho detto sopra, ho esaminato la domanda precedente riguardante questo problema e non ho ancora trovato una soluzione. Altrimenti, grazie per il tuo aiuto.

+0

Quali autorizzazioni viene eseguita sul sistema dall'applicazione Utente console dell'utente? L'app della console crea questi file? –

+0

È in esecuzione sotto di me, i file vengono copiati da una condivisione di file di rete su un'unità locale in cui sono presenti i diritti di amministratore locale. Inoltre, sia la condivisione di file che la macchina locale si trovano all'interno di un dominio che ho accesso completo in lettura/scrittura a tutto ciò che appartiene al nostro dominio. Non sta creando nulla, ma solo copiando e poi cancellando dai dati copiati. – CalebB

+0

Quale riga provoca l'eccezione? Questo vale per qualsiasi file o forse solo per un particolare file? – dymanoid

risposta

1

Capito che il problema era che i file venivano contrassegnati come "di sola lettura", quindi ho aggiunto un'istruzione if prima della cancellazione del file per verificare se era e rimuovere il segno se necessario. Ecco il codice che ha funzionato correttamente per l'eliminazione di tutti i file desiderati.

#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 

Grazie a coloro che commentano e hanno aiutato. E spero che questo possa aiutare gli altri in futuro.

+0

Considera di rendere 'BadFiles' a' HashSet '. 'HashSet.Contains' sarà molto più veloce di' Array.Contains'. 'HashSet.Contains' esegue una ricerca diretta piuttosto che una ricerca sequenziale. Non farà alcuna differenza nella velocità di runtime per questa applicazione perché il fattore limitante è il tempo di I/O del disco, ma è una buona pratica generale. –

+0

Ne esaminerò sicuramente, grazie per i suggerimenti. – CalebB