Impossibile aprire il file

venerdì 24 ottobre 2008 - 12.02

frenk17 Profilo | Junior Member

ragazzi ho ancora bisogno del vostro aiuto...
provate a lanciare il mio programma..
non riesco a capire come mai la funzione "stampa" ogni tanto funziona e ogni tanto mi fa l errore "Il processo non può accedere al file 'C:\Programmi\Timbratura\2008\appoggio.txt' perché è in uso da un altro processo."


e non riesco a capire come mai...
non ci sono file aperti e non so dove sbattere la testa ...

spero che riusciate ad aiutarmi
grazie



PS PRIMA DI SPERIMENTARE IL TUTTO IMPOSTATE L'ORA DI SISTEMA INTORNO ALLE 8 DEL MATTINO, perchè essendo un programma per la timbratura non tollera che un dipendente entri al lavoro all ora alla quale eseguirete il programma voi, di conseguenza non entrerà neanche nella funzione "stampa"...


grazie ancora

freeteo Profilo | Guru

ciao,
il fatto può dipendere dal fatto che apri il file in maniera esclusiva in lettura, e tenti di accederci in un momento in cui non è ancora stato liberato il file da windows tipicamente da un'operazione precedente ancora sospesa.

Quando apri il file, accertati di impostare lo "share" che sia anche per gli altri, ad esempio io proverei a mettere:
... objStreamReader = New StreamReader(File.Open(appoggio, FileMode.Open, FileAccess.Read, FileShare.Read)) ...
e quando fai l'openFile:
FileOpen(1, orario, OpenMode.Append, OpenAccess.ReadWrite)
prova a vedere se qualcuna di queste impostazioni ti evita il lock di accesso.

ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo

frenk17 Profilo | Junior Member

alla fine ho risolto con il comando
GC.Collect()
il problema era come mi che il prog non rilasciava in tempo il file...
ma ora è tutto risolto
grazie comunque

freeteo Profilo | Guru

>alla fine ho risolto con il comando
> GC.Collect()
>il problema era come mi che il prog non rilasciava in tempo il
>file...
si è classico quando usi gli stream, come ti dicevo, in C# infatti è buona norma usare lo statement "using" con questi oggetti che possono rimanere loccati, in modo da fare il "Dispose" in automatico...

cmq ok, anche usare il Collect va bene, solo che attento che sarebbe sconsigliato usarlo perchè è un momento di "sovraccarico" non da poco del runtime di .net su quella macchina
Alcuni post a sostegno di questa best practice:
http://blogs.msdn.com/ricom/archive/2004/11/29/271829.aspx
http://www.scribd.com/doc/4700499/Best-Practices-in-C
http://stackoverflow.com/questions/118633/whats-so-wrong-about-using-gccollect
http://www.velocityreviews.com/forums/showpost.php?s=d12eab81b7ed168dc4a153b071bc2c77&p=471482&postcount=2


ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo

tonyexpo Profilo | Senior Member

Ciao a tutti

in effettti il collect della Garbage obblica il framework a reindicizzare tutti gli oggetti in memoria per verificarne l'effettivo utilizzo ed eventualmente procedere alla loro distruzione....
questo consuma molte risorse e nel caso specifico distrugge lo stream, rilasciando la risorsa (il file).

c'è ovviamente un modo molto migliore per rilasciare la risorsa dopo l'uso, ed è invocare il metodo Close() dell'oggetto stream utilizzato.
Così facendo non capiterà mai più di avere il file bloccato.
Anche l'utilizzo del costrutto Using in VB e C# aiuta, in quanto in metodo Close() viene invocato in automatico dal framework per noi dal metodo DIspose() invocato automaticamente alla fine del costrutto Using.


Antonio Esposito
MCP, MCTS .NET 2.0 Distributed applications
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5