2015-04-27 11 views
6

Jak to możliwe, że po wywołaniu File.Delete plik nadal istnieje? Użyłem prostego kodu do odtworzenia problemu przy użyciu File.Open. Oczekiwany wyjątek to FileNotFoundException. Sprawdziłem operację w Process Monitor v3.05, a wynik dla pliku to "DELETE PENDING" i generuje wynik UnauthorizedAccessException. Czy ktoś ma wytłumaczenie tego?Po uruchomieniu File.Delete plik pozostaje w trybie 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

Sprawdź program antywirusowy, może to oznaczać, że blokuje on plik. –

+0

Usługa indeksowania systemu Windows jest innym standardowym winowajcą. –

+0

To prawda, ale system Windows musi poczekać, aż wszystkie klamki zostaną zamknięte przed usunięciem, dopóki nie zostanie usunięty. –

Odpowiedz

2

Windows umożliwia proces, aby usunąć plik, choć wciąż jest otwarty przez inny proces (np Usługa indeksowania systemu Windows lub program antywirusowy). Zostaje wewnętrznie oznaczony jako "usuń oczekujące". Plik faktycznie nie zostanie usunięty z systemu plików, jest nadal dostępny po wywołaniu File.Delete. Każdy, kto próbuje otworzyć plik po tym, otrzymuje błąd odmowy dostępu. Plik faktycznie nie zostanie usunięty, dopóki ostatni uchwyt obiektu pliku nie zostanie zamknięty.