IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Comment éviter plantage quand un fichier est déjà ouvert par un autre processus ?


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    378
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 378
    Points : 94
    Points
    94
    Par défaut Comment éviter plantage quand un fichier est déjà ouvert par un autre processus ?
    Bonjour,
    je réalise un petit code pour parcourir toute l'arborescence de mon disque dur et pour chaque fichier je souhaite réaliser un MD5
    Mais au bout de quelques fichiers mon programme plante car un fichier est déjà en cours d'utilisation : hiberfil.sys
    mais je n'arrive pas à contourner ce problème où string est le chemin du fichier obtenu par FileInfo.FullName
    voici la fonction utilisée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     private static MD5 md5 = MD5.Create();
            private static string CalculateChecksum ( string file )
                {
                using ( FileStream stream = File.OpenRead ( file ) )
                    {
                    byte [] checksum = md5.ComputeHash ( stream );
                    return ( BitConverter.ToString ( checksum ).Replace ( "-", string.Empty ));
                    } // End of using fileStream
                }

    Merci

  2. #2
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2015
    Messages : 26
    Points : 46
    Points
    46
    Par défaut
    Vous pouvez intercepter l'exception générée quand cela se produit pour retourner une chaîne vide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    try
    {
       using ( FileStream stream = File.OpenRead ( file ) )
       {
          byte [] checksum = md5.ComputeHash ( stream );
          return ( BitConverter.ToString ( checksum ).Replace ( "-", string.Empty ));
       }
    }
    catch
    {
       return String.Empty;
    }

  3. #3
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    La solution de phil.o est intéressante pour ce cas précis. D'une manière plus générale, on peut vérifier si un fichier est en cours d'utilisation en utilisant la méthode ci-dessous :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    protected virtual bool IsFileLocked(FileInfo file)
    {
        FileStream stream = null;
     
        try
        {
            stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.None);
        }
        catch (IOException)
        {
            // the file is unavailable because it is:
            // still being written to
            // or being processed by another thread
            // or does not exist (has already been processed)
            return true;
        }
        finally
        {
            if (stream != null)
                stream.Close();
        }
     
        //file is not locked
        return false;
    }
    Source: Is there a way to check if a file is in use?

    Si la méthode renvoie true alors on peut ignorer le fichier. Si elle renvoie false alors on peut l'ouvrir et le traiter.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  4. #4
    Membre habitué Avatar de maleaume
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 93
    Points : 131
    Points
    131
    Par défaut FileShare
    en plus des exceptions qui sont toujours intéressante à garder utilise ce mode d ouverture pour tes fichiers
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
    Je l 'utilise par exemple pour analyser (Lire) en temps réel des fichiers de log générés (Ecriture) par un programme tierce.
    Cela fonctionna condition que le programme autorise la lecture du fichier alors que lui même le lit.
    Il se peut que par soucis de sécurité des fichiers système ne puisse pas être Read/write en même temps.
    Dans ce cas choppe la bonne exception (SecurityException)

    https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx

Discussions similaires

  1. Réponses: 7
    Dernier message: 06/05/2014, 09h34
  2. Réponses: 3
    Dernier message: 13/12/2012, 00h21
  3. Réponses: 0
    Dernier message: 11/07/2011, 12h25
  4. Copie de fichier ouvert par un autre processus
    Par L_Art_Ment dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 22/07/2010, 23h17
  5. Tester si un fichier est déjà ouvert par un programme tiers
    Par E@gle_One dans le forum Entrée/Sortie
    Réponses: 16
    Dernier message: 17/04/2008, 11h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo