Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
ASP.NET 2.0 / 3.5 / 4.0
Liberare risorse dopo scrittura su file...
mercoledì 17 febbraio 2010 - 15.38
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
andrestu
Profilo
| Expert
772
messaggi | Data Invio:
mer 17 feb 2010 - 15:38
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
229
messaggi | Data Invio:
mer 17 feb 2010 - 20:04
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
772
messaggi | Data Invio:
mer 17 feb 2010 - 20:20
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
229
messaggi | Data Invio:
mer 17 feb 2010 - 20:26
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
772
messaggi | Data Invio:
mer 17 feb 2010 - 20:41
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
229
messaggi | Data Invio:
mer 17 feb 2010 - 21:04
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
Torna su
Stanze Forum
Elenco Threads
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 !