2010-06-07 9 views
16

Existe-t-il un moyen de savoir si un fichier est déjà ouvert ou non?Vérifiez si un fichier est ouvert

+2

S'il vous plaît offrir plus de détails. Déjà ouvert par votre processus, ou un autre processus? Période ouverte, ou juste ouvert avec un accès en écriture? Qu'en est-il du partage? etc. Cette question est trop vague. – hemp

Répondre

26
protected virtual bool IsFileinUse(FileInfo file) 
{ 
    FileStream stream = null; 

    try 
    { 
     stream = file.Open(FileMode.Open, FileAccess.ReadWrite, 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(); 
    } 
    return false; 
} 
+2

Si le processus n'a pas accès en écriture au fichier, cela produira un résultat trompeur (l'ouverture échouera, mais pas nécessairement parce qu'une poignée existe). L'ouverture pour l'accès en lecture serait moins sujette aux erreurs. – hemp

+4

Incroyable que la plupart des langues n'ont pas une méthode pour tester le fichier est ouvert. Nous utilisions le même type de méthode sous C++ dans OS/2. c'est-à-dire essayer d'ouvrir le fichier exclusif. Cela fonctionne assez bien, mais je ne l'ai jamais trouvé élégant. – Matt

+2

Ce n'est pas une fonctionnalité de langue, c'est une fonctionnalité du système d'exploitation. Il n'existe tout simplement pas d'API simple (sous Windows) pour interroger cette information. Il est possible d'obtenir, mais c'est de bas niveau et il y a beaucoup de paramètres qui devraient être spécifiés pour savoir ce que l'on entend par "ouvert". – hemp

7

Comme @pranay rana, mais nous devons nous assurer que nous fermons notre poignée de fichier:

public bool IsFileInUse(string path) 
{ 
    if (string.IsNullOrEmpty(path)) 
    throw new ArgumentException("'path' cannot be null or empty.", "path"); 

    try { 
    using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read)) { } 
    } catch (IOException) { 
    return true; 
    } 

    return false; 
} 
+0

Identique à @pranay rana, j'ai testé cette méthode, mais elle ne détecte pas quand le fichier est ouvert dans Notepad . – James

1

Si vous voulez dire que vous voulez vérifier si un fichier est ouvert avant d'essayer de l'ouvrir , alors non. (Du moins pas sans passer au niveau bas et examiner chaque poignée de fichier qui est ouverte dans le système.)

En outre, l'information serait ancienne quand vous l'aurez. Même si le test retourne que le fichier n'est pas ouvert, il aurait pu être ouvert avant que vous ayez une chance d'utiliser la valeur de retour. Par conséquent, la meilleure façon de gérer la situation est d'essayer d'ouvrir le fichier et de gérer toute erreur pouvant survenir.

0

D'accord. Je voudrais créer une classe désignée qui enveloppe la logique de fichier ouvert ou au moins le test (IsFileAvailable). Cela vous permettra de placer la gestion des exceptions avec une classe spécifiquement responsable et de la rendre réutilisable. Vous pouvez même appliquer d'autres logiques, telles que tester la taille du fichier pour voir si le fichier est en cours d'écriture dans etc, pour donner une réponse plus détaillée. Cela rendra également votre code de consommation beaucoup plus propre.

Questions connexes