Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Capire se un file è in uso.
Forum - C# / VB.NET - Capire se un file è in uso.

Avatar
fosforo (Normal User)
Expert


Messaggi: 391
Iscritto: 06/04/2009

Segnala al moderatore
Postato alle 18:00
Mercoledì, 09/06/2021
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


PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 21:43
Mercoledì, 09/06/2021
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.

Codice sorgente - presumibilmente C# / VB.NET

  1. using (var md5 = MD5.Create())
  2. {
  3.     using (var stream = File.OpenRead(filename))
  4.     {
  5.         return md5.ComputeHash(stream);
  6.     }
  7. }



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.





https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 1:17
Giovedì, 10/06/2021
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:

Codice sorgente - presumibilmente C#

  1. String cartellabkp = @"C:\Utente\Documenti\Backup";
  2.  
  3. foreach (string value in System.IO.Directory.GetFiles(cartellabkp))
  4. {
  5.     try
  6.     {
  7.         System.IO.File.Move(value, value);
  8.         MessageBox.Show(value + Environment.NewLine + "File OK");
  9.     }
  10.     catch (Exception er)
  11.     {
  12.         MessageBox.Show(value + Environment.NewLine + er.Message);
  13.     }
  14. }




Ultima modifica effettuata da Carlo il 10/06/2021 alle 10:19


in programmazione tutto è permesso
PM Quote
Avatar
fosforo (Normal User)
Expert


Messaggi: 391
Iscritto: 06/04/2009

Segnala al moderatore
Postato alle 13:43
Giovedì, 10/06/2021
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

PM Quote