Liberare risorse dopo scrittura su file...

mercoledì 17 febbraio 2010 - 15.38

andrestu Profilo | Expert

Provando un sito e-commerce da me creato mi sono accorto che mi rimane bloccato un file su disco, vi spiego meglio.

al momento dell'invio ordinazione il sito è progettato per creare un file copiandolo da una certa posizione ad un altra specifica dell'utente (.../nome utente/nome file...), se il file esiste già verrà sovrascritto.

File.Copy("percorso nome file da copiare", ,"percorso nuovo file", "true x sovrascrivere");

e qui mi è nato il problema, nel senso che se il file non esiste va tutto liscio ma se il file esiste già mi da un errore di copia dovuto al fatto che il file esistente è bloccato da un altro processo, e se chiudo e riapro il browser faccio un logout e login il problema rimane...

la prima cosa che mi viene in mente per evitare questo fastidioso problema è utilizzare qualche sistema per creare file in modo tale che subito dopo l'utilizzo riesco a sbloccare forzatamente con qualche istruzione il legame tra il file e il processo, cè li modo di farlo?
suggerimenti in merito?

tonyexpo Profilo | Senior Member

Ciao

evidentemente il file è utilizzato dal tuo web e non rilasci la risorsa quindi quando lanci la copia schianta....

verifica dove usi il file, o se gli utenti web ne hanno accesso: IIS ti blocca il file se è in uso da se stesso


Antonio Esposito
MCTS, MCP

http://blogs.dotnethell.it/espositos

andrestu Profilo | Expert

si ma il problema rimane anche quando chiudo il browser, e per ora sono solo io che lo utilizzo, quindi succede che il processo avviato durante la prima operazione rimane in qualche modo legato al file in questione e "scade" dopo un pò, infatti dopo un pò riesco ad eliminarlo.
La soluzione, leggendo un pò in rete, sta nell'utilizzare l'oggetto filestream che da la possibilità di essere disposable e quindi chiuderlo e liberare le risorse manualmente tramite codice, il punto è che è un pò più macchinoso utilizzarlo.
Non capisco, dopotutto faccio una semplice operazione di copia da una posizione ad un altra, e l'unica istruzione che utilizzo è file.Copy(origine, destinazione) e successivamente un istruzione di File.AppendAllText(file, stringa) forse è proprio questultima che mi blocca il file ma non ci sono metodi della classe file x sbloccarlo

Forse questo succede perchè sono metodi statici sulla classe file

tonyexpo Profilo | Senior Member

Ciao

si il filestream utilizzato con il costrutto using è un metodo sicuro per scrivere o leggere su di un file
ma anche il metodo copy e il metodo appendalltext sono metodi atomici, cioè non lasciano il file lockato

il file rimane bloccato perchè impegnato in qualche altro modo dal web (codice) o semplicemente perchè aperto in un browser
ricorda che anche se chiudi il browser la tua sessione dura in genere altri 20 minuti sul server


Antonio Esposito
MCTS, MCP

http://blogs.dotnethell.it/espositos

andrestu Profilo | Expert

ok forse ho capito "di chi è la colpa",
successivamente alla copia e modifica il file viene collegato come allegato ad un messaggio mail che viene poi inviato, quindi l'oggetto che lo blocca probabilmente è il seguente:

Attachment att = new Attachment(percorso file);

provo ad utilizzarlo tramite using, oppure richiamare il dispose.
Visto che ci siamo ti faccio altre 2 domande a riguardo, non sono sicuro di aver capito bene ma utilizzndolo tramite using è l'equivalente di chiamare il metodo dispose alla fine del suo utilizzo?
Se così qual'è la differenza?

cosa intendi con "sono metodi atomici" cioè che liberano risorse in automatico?

tonyexpo Profilo | Senior Member

si è molto probabile che sia colpa dell'attachement, in effetti l'oggetto non è distrutto subito dopo l'invio della mail.... prova a usare lo using (se possibile perchè implementa idisposable) altrimenti leggi i bytes del file con File.ReadAllBytes e passa al costruttore dell'attachement un New MemoryStream(<bytes letti prima>);
per file piccoli è perfetto




ti spiego:

quando uso l'using alla creazione la variabile è istanziata dichiarando uno scope (ambito della visibilità) della variabile legato allo using in pratica puoi fare un secondo using dopo con lo stesso nome di variabile anche se di tipo diverso

in più quando esci dallo using, non solo fa al posto tuo il dispose, ma distrugge anche il riferimento alla variabile, infatti come ho detto prima è visibile solo al suo interno, quindi tutte le risorse sono subito liberate senza aspettare la garbage collection che di solito fa pulizia delle variabili inutilizzate per liberare risorse



i metodi statici della classe File tipo .Copy, .ReadAllBytes, .WriteAllBytes e via di seguito sono atomici: cioè la loro esecuzione non lascia alcun riferimento all'esterno di se stessi rilasciando ogni risorsa utilizzata


ciao

Antonio Esposito
MCTS, MCP

http://blogs.dotnethell.it/espositos
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5