Oppure

Loading
09/06/21 16:00
fosforo
Ciao a tutti

Ho una cartella di Backup su una SAN che viene popolata da un programma di sincronizzazione file.
I file sono molto pesanti.
Volevo creare un programmino che mi monitorasse quali file sono in fase di copia.

Ho provato cosi:

foreach (string value in cartellabkp)
{
try
{
using (Stream stream = new FileStream(value, FileMode.Open))
{
MessageBox.Show(value + "File OK";);
}
}
catch (IOException)
{
MessageBox.Show(value + " No OK";);
}
}

Purtroppo vede tutti i file come occupati mentre sono sicuro che sono liberi.
Per esserne certo ho provato a rinominarli.

Il problema è perché i file sono una SAN?
Come posso risolvere?

Grazie in anticipo

aaa
09/06/21 19:43
Thejuster
Non sò come funziona una SAN.

Ma solitamente, i file vengono verificati tramite un hash del file stesso.

Come si sa, anche se cambia un solo bit in un file, il suo hash è diverso.


using (var md5 = MD5.Create())
{
    using (var stream = File.OpenRead(filename))
    {
        return md5.ComputeHash(stream);
    }
}



Un programma tipo dropbox o mega, quando viene sovrascritto in creato un file in quella determinata cartella parte il computing e l'upload del file stesso.

Evidentemente da come dici "Purtroppo vede tutti i file come occupati mentre sono sicuro che sono liberi."
Non conoscendo come funziona un SAN, posso solo immaginare che ci sia un servizio o processo in background che tiene costantemente traccia di quei file.

Per toglierti il dubbio puoi provare a chiudere questo processo o magari fare un test in modalità provvisoria per capire se il problema dipenda proprio da qualche processo o servizio nascosto.

Tolto il dubbio, si possono cercare strade diverse.



mire.forumfree.it/ - Mire Engine
C# UI Designer
09/06/21 23:17
Carlo
Il tuo sistema dovrebbe funzionare, prova questo metodo per sapere se un file è in uso, lo rinomini con lo stesso nome, se la rinomina non va a buon fine il file è in uso:

String cartellabkp = @"C:\Utente\Documenti\Backup";

foreach (string value in System.IO.Directory.GetFiles(cartellabkp))
{
    try
    {
        System.IO.File.Move(value, value);
        MessageBox.Show(value + Environment.NewLine + "File OK");
    }
    catch (Exception er)
    {
        MessageBox.Show(value + Environment.NewLine + er.Message);
    }
}


Ultima modifica effettuata da Carlo 10/06/21 8:19
in programmazione tutto è permesso
10/06/21 11:43
fosforo
Ciao

Innanzi tutto grazie.

La soluzione di Carlo è perfetta.

Ho solo una domanda per Thejuster:
Se ho capito bene cos'è l'MD5, possibile farlo quando il file è ancora aperto?
Devo averlo anche lato SAN?

Grazie
aaa