PDA

View Full Version : [c#] Gestione errori try-catch concorrenza file


k-it
11-02-2011, 15:13
Salve,
ho scritto un applicativo in c# su visual studio 2008.
Mi trovo a dover gestire una concorrenza su un file da cancellare che viene scritto da un'altra applicazione.
Ho inserito la file.delete all'interno del try e vorrei, semplicemente, che se non riesce a cancellarlo non ritorni nessun errore, perchè poi ci riproverà al successivo giro dell'applicazione. Adesso invece se trova il file occupato da un altro processo mi si blocca l'applicazione con l'errore che non ha potuto accedere al file.
Come devo gestirla?
Grazie!!!
Ciao!

s1m0_93
12-02-2011, 17:17
Salve,
ho scritto un applicativo in c# su visual studio 2008.
Mi trovo a dover gestire una concorrenza su un file da cancellare che viene scritto da un'altra applicazione.
Ho inserito la file.delete all'interno del try e vorrei, semplicemente, che se non riesce a cancellarlo non ritorni nessun errore, perchè poi ci riproverà al successivo giro dell'applicazione. Adesso invece se trova il file occupato da un altro processo mi si blocca l'applicazione con l'errore che non ha potuto accedere al file.
Come devo gestirla?
Grazie!!!
Ciao!

Penso che basti non scrivere nulla nel catch


try
{

//tentativo di eliminazione file

}
catch(Exception ex)
{
}

DarkSiDE
12-02-2011, 18:28
Penso che basti non scrivere nulla nel catch


try
{

//tentativo di eliminazione file

}
catch(Exception ex)
{
}



vero :)

k-it
13-02-2011, 14:33
vero :)

if (by_ing5.Length > 0 && by_ing6.Length > 0)
{
try
{
File.Delete(@"Z:\TEMP\scatta_usc");
}
catch { }
}
avevo messo così, non avevo messo Exception ex, provo e vedo se va

k-it
15-02-2011, 11:44
if (by_ing5.Length > 0 && by_ing6.Length > 0)
{
try
{
File.Delete(@"Z:\TEMP\scatta_usc");
}
catch { }
}
avevo messo così, non avevo messo Exception ex, provo e vedo se va

si pare che vada! :)
Grazie!

ziggy1979
18-02-2011, 16:07
Ciao a tutti,
ho letto quanto suggerito e concordo su quasi tutto.
Infatti stare in ascolto sulla exception è corretto ma io starei un po' meno generico.
Infatti:
1) starei solo in ascolto solo sulle eccezioni di tipo IOException
2) nel caso di eccezioni di tipo IOException inoltre andrei a vedere se l'eccezione era dovuta al fatto che il file è lokkato da altri processi e non per altri motivi
Ecco il mio codice


try
{
File.Delete(fileName);
}
catch (IOException ex)
{
if (IsFileLocked(ex))
{
//siamo d'accordo che non devi fare nulla
}
else
{
throw;
}
}

dove la procedura IsFileLocked è la seguente.

private static bool IsFileLocked(IOException exception)
{
int errorCode = Marshal.GetHRForException(exception) & ((1 << 16) - 1);
return errorCode == 32 || errorCode == 33;
}

Ziggy.

k-it
19-02-2011, 09:13
Ciao a tutti,
ho letto quanto suggerito e concordo su quasi tutto.
Infatti stare in ascolto sulla exception è corretto ma io starei un po' meno generico.
Infatti:
1) starei solo in ascolto solo sulle eccezioni di tipo IOException
2) nel caso di eccezioni di tipo IOException inoltre andrei a vedere se l'eccezione era dovuta al fatto che il file è lokkato da altri processi e non per altri motivi
Ecco il mio codice


try
{
File.Delete(fileName);
}
catch (IOException ex)
{
if (IsFileLocked(ex))
{
//siamo d'accordo che non devi fare nulla
}
else
{
throw;
}
}

dove la procedura IsFileLocked è la seguente.

private static bool IsFileLocked(IOException exception)
{
int errorCode = Marshal.GetHRForException(exception) & ((1 << 16) - 1);
return errorCode == 32 || errorCode == 33;
}

Ziggy.

Ciao,
il delete e tutto il resto adesso sembra funzionare con try e cathc(IOException ex), il nuovo problema riguarda una dll che carico nell'onLoad del form,
il tutto funziona per un certo tempo quando dopo un po' di ore mi ritrovo che è andato in errore, dagli AppCrash che salva windows 7 sembra che sia la dll in questione ad andare in errore, ma non so come gestirla. Dovrei poter riavviare il programma in automatico quando si blocca ma non so se è possibile, anche perchè non mi ritorna un errore di una particolare funzione del mio programma ma sembra che sia la dll stessa ad andare in errore e non posso gestirla.
Bohhhh :)

ziggy1979
20-02-2011, 10:59
scusa ma non puoi semplicemente mettere le chiamate a questa dll sotto dei blocchi try catch?
così se la chiami e spacca, intercettando l'errore, non ti crassha la tu app.
oppure proverei a caricare e scaricare la dll prima e dopo l'utilizzo!

k-it
21-02-2011, 08:36
scusa ma non puoi semplicemente mettere le chiamate a questa dll sotto dei blocchi try catch?
così se la chiami e spacca, intercettando l'errore, non ti crassha la tu app.
oppure proverei a caricare e scaricare la dll prima e dopo l'utilizzo!

Non la posso richiamare direttamente io ma io avvio solo l'istanza che poi richiama la dll quando gli occorre
public void Form1_Load(object sender, EventArgs e)
{

//caricamento e avvio dell'applicazione Anpr all'apertura della finestra (Form1)
AnprSupport.Instance.Open(Handle); //collegata al riferimento della finestra Handle
AnprSupport.Instance.LoadConfiguration("anpr2test.ini"); //caricamento file configurazione
AnprSupport.Instance.ReadReceived += ReadHandler; //collegamento alla funzione ReadHandler alla ricezione della lettura
AnprSupport.Instance.Start(); //avvio dell'applicazione
System.Diagnostics.Process test = System.Diagnostics.Process.Start("C:\\Program Files\\etech\\setup_diatec\\Diatec1.exe","/MIN");
Worker workerObject = new Worker();
Thread workerThread = new Thread(workerObject.DoWork);
workerThread.Start();


}

k-it
07-03-2011, 09:59
solo la modifica della dll stessa ha risolto il problema