2013-08-06 4 views
7

Sto cercando di gestire i file nella mia applicazione web. A volte, devo creare un file in una cartella (con File.Copy):Il file viene utilizzato da un altro processo dopo File.Copy

File.Copy(@oldPath, @newPath); 

E pochi secondi dopo che il file possono essere eliminati:

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

Comunque, io non so perché il nuovo file rimane bloccato dal processo del server (IIS, w3wp.exe) dopo File.Copy. Dopo File.Delete ottengo l'eccezione:

"Il processo non può accedere al file perché è utilizzato da un altro processo."

In base all'API, File.Copy non blocca il file, vero?

Ho provato a rilasciare le risorse ma non ha funzionato. Come posso risolvere questo?

AGGIORNATO: Infatti, utilizzando Process Explorer il file è bloccato dal processo IIS. Ho cercato di implementare il codice copia al fine di rilasciare manualmente le risorse ma il problema continua ancora:

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

Quindi, che cosa sta utilizzando il file? Chiaramente non creeresti inutilmente un file che nient'altro usa solo per cancellarlo pochi secondi dopo, quindi qualcosa deve usarlo. Cos'è questo qualcosa? –

+0

Il file proviene da un altro sistema quindi, è cambiato in esso, devo sostituire quello vecchio. Sto sviluppando un sistema "specchio". – jbernal

+0

Forse questa domanda simile potrebbe aiutarti: http://stackoverflow.com/questions/7937966/ – Bridge

risposta

0

Il file veniva bloccato da un altro processo senza che io me ne accorgessi. Process Explorer è stato davvero utile.

Tipico problema facile difficile da individuare.

2

Ciò può essere causato da indicizzatori di file o software anti virus, che in genere la scansione di tutti i nuovi file.

+1

Certo, è un'opzione ma quante volte ci vuole? Ho aspettato diversi minuti ma il file continua a essere bloccato. – jbernal

+1

Si potrebbe provare [Process Explorer] (http://technet.microsoft.com/en-gb/sysinternals/bb896653.aspx) da sysinternals. Usando la funzione "Trova maniglia o DLL" mostrerai quali processi hanno un handle aperto sul tuo file. – x5657

+1

Programma molto utile. L'ho usato e infatti l'unico processo che usa il file è w3wp.exe (IIS). Ho intenzione di implementare la funzione di copia con flussi per scrivere esplicitamente la frase close() o dispose(). – jbernal

3

È possibile provare Process Explorer per trovare quale applicazione ha aperto l'handle di file. Se Process Explorer non riesce a trovarlo, utilizzare Process Monitor per individuare quale processo sta tentando di accedere al file.