web-dev-qa-db-fra.com

Vérifiez si un fichier est ouvert

Y a-t-il un moyen de trouver si un fichier est déjà ouvert ou non?

17
Md. Rashim Uddin
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; 
}
27
Pranay Rana

Comme @pranay Rana, mais nous devons nous assurer de fermer 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;
}
8
Matthew Abbott

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

En outre, l'information serait ancienne quand vous l'obtenez. Même si le test reviendrait que le fichier n'est pas ouvert, il aurait pu être ouvert avant d'avoir une chance d'utiliser la valeur de retour.

Donc, la bonne façon de gérer la situation est d'essayer d'ouvrir le fichier et de gérer toute erreur que possible.

1
Guffa

D'accord. Je créerais une classe désignée qui enveloppe la logique de fichier ouverte ou au moins le test (isfilableable). Cela vous permettra de placer la gestion d'exception avec une classe spécifiquement responsable et de le rendre réutilisable. Vous pouvez même appliquer une logique supplémentaire, telle que tester la taille du fichier pour voir si le fichier est écrit sur, etc., pour donner une réponse plus détaillée. Cela rendra également votre code consommateur beaucoup plus propre.

0
NoelAdy