2015-04-27 14 views
6

Come è possibile che dopo aver chiamato File.Delete il file esista ancora a volte? Ho usato un codice semplice per riprodurre il problema utilizzando File.Open. L'eccezione prevista è FileNotFoundException. Ho controllato l'operazione in Process Monitor v3.05 e il risultato per il file è "DELETE PENDING" e ho generato UnauthorizedAccessException. Qualcuno ha una spiegazione per questo?Dopo aver eseguito File.Delete, il file rimane in DELETE PENDING

public class Program 
{ 
    private const string DummyFileName = "dummy.txt"; 

    private static void Main(string[] args) 
    { 
     int attempt = 0; 
     while (true) 
     { 
      using (File.Create(DummyFileName)) 
      { 
      } 

      File.Delete(DummyFileName); 

      try 
      { 
       attempt++; 
       using (File.Open(DummyFileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) 
       { 
       } 
      } 
      catch (FileNotFoundException) 
      { 
      } 
      catch (UnauthorizedAccessException ex) 
      { 
       Console.WriteLine("File exists{0}", File.Exists(DummyFileName)); 
       Console.WriteLine("File remains in DELETE PENDING state in attempt {0}.", attempt); 
       Console.WriteLine(ex); 
       Console.ReadKey(); 
      } 
     } 
    } 
} 
+0

Controllare l'antivirus, potrebbe trattarsi di una sospensione del file per un breve periodo. –

+0

Il servizio di indicizzazione di Windows è un altro colpevole standard. –

+0

Lo fa, ma Windows deve attendere fino a quando tutti gli handle sono chiusi prima di cancellarlo, fino a quando non viene cancellato. –

risposta

2

Windows consente un processo per eliminare un file, anche se è ancora aperto da un altro processo (ad esempio servizio di indicizzazione di Windows o Antivirus). Viene internamente contrassegnato come "cancella in sospeso". Il file non viene effettivamente rimosso dal file system, è ancora lì dopo la chiamata File.Delete. Chiunque tenti di aprire il file dopo aver ricevuto un errore di accesso negato. Il file non viene effettivamente rimosso finché non viene chiuso l'ultimo handle dell'oggetto file.