2013-08-06 10 views
7

Próbuję zarządzać plikami w mojej aplikacji internetowej. Czasami muszę utworzyć plik w folderze (z File.Copy):Plik jest używany przez inny proces po File.Copy

File.Copy(@oldPath, @newPath); 

a kilka sekund później, że plik może zostać usunięty:

if (File.Exists(@newPath)) { 
    File.Delete(@newPath);    
} 

Jednak nie wiem dlaczego nowy plik pozostaje zablokowany przez proces serwera (IIS, w3wp.exe) po File.Copy. Po File.Delete otrzymuję wyjątek:

"Proces nie może uzyskać dostępu do pliku, ponieważ jest on używany przez inny proces."

Według Api plik File.Copy nie blokuje pliku, prawda?

Próbowałem zwolnić zasoby, ale nie zadziałało. Jak mogę to rozwiązać?

ZAKTUALIZACJA: Rzeczywiście, używając Process Explorer plik jest blokowany przez proces IIS. Próbowałem zaimplementować kod kopiowania w celu uwolnienia zasobów ręcznie, ale problem nadal jest długa:

public void copy(String oldPath, String newPath) 
    { 
    FileStream input = null; 
    FileStream output = null; 
    try 
    { 
     input = new FileStream(oldPath, FileMode.Open); 
     output = new FileStream(newPath, FileMode.Create, FileAccess.ReadWrite); 

     byte[] buffer = new byte[32768]; 
     int read; 
     while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
     { 
     output.Write(buffer, 0, read); 
     } 
    } 
    catch (Exception e) 
    { 
    } 
    finally 
    { 
     input.Close(); 
     input.Dispose(); 
     output.Close(); 
     output.Dispose(); 
    } 
    } 
+1

Więc co to jest za plik? Najwyraźniej nie byłoby po prostu bezcelowe tworzenie pliku, którego nic więcej nie używa, aby usunąć go kilka sekund później, więc coś musi z niego korzystać. Co to jest? –

+0

Plik pochodzi z innego systemu, więc został w nim zmieniony. Muszę zastąpić stary. Opracowuję system "lustrzany". – jbernal

+0

Być może to podobne pytanie może ci pomóc: http://stackoverflow.com/questions/7937966/ – Bridge

Odpowiedz

0

Plik został zablokowany przez inny proces, nie wiedząc o tym. Process Explorer był naprawdę pomocny.

Typowa trudna do wykrycia trudna sprawa.

2

Może to być spowodowane przez indeksujących plików lub oprogramowania antywirusowego, które zazwyczaj skanować wszystkie nowe pliki.

+1

Oczywiście jest to opcja, ale ile czasu to zajmuje? Czekałem kilka minut, ale plik nadal jest blokowany. – jbernal

+1

Możesz spróbować [Process Explorer] (http://technet.microsoft.com/en-gb/sysinternals/bb896653.aspx) z sysinternals. Korzystanie z funkcji "Znajdź uchwyt lub bibliotekę DLL" pokazuje, które procesy mają otwarty uchwyt do pliku. – x5657

+1

Bardzo przydatny program. Użyłem go i rzeczywiście jedynym procesem używającym tego pliku jest w3wp.exe (IIS). Zamierzam zaimplementować funkcję kopiowania za pomocą strumieni w celu bezpośredniego napisania zdania close() lub dispose(). – jbernal

3

Możesz spróbować Process Explorer, aby znaleźć aplikację, która otworzyła uchwyt pliku. Jeśli Process Explorer nie może tego znaleźć, użyj Process Monitor, aby sprawdzić, który proces próbuje uzyskać dostęp do pliku.

Powiązane problemy