Question

J'ai une application où je dois parfois lire le fichier en cours d'écriture à et par conséquent être verrouillé. Comme je l'ai compris d'autres je dois prendre le IOException et une nouvelle tentative jusqu'à ce que je peux lire.

Mais ma question est de savoir comment puis-je savoir pour que le fichier est verrouillé et qu'il ne soit pas une autre IOExcetpion qui se produit.

Était-ce utile?

La solution

Lorsque vous ouvrez un fichier pour la lecture dans .NET il à un moment essayer de créer un descripteur de fichier en utilisant le la fonction API de CreateFile qui définit la code d'erreur qui peut être utilisé pour voir pourquoi il a échoué:

const int ERROR_SHARING_VIOLATION = 32;
try
{
    using (var stream = new FileStream("test.dat", FileMode.Open, FileAccess.Read, FileShare.Read))
    {
    }
}
catch (IOException ex)
{
    if (Marshal.GetLastWin32Error() == ERROR_SHARING_VIOLATION)
    {
        Console.WriteLine("The process cannot access the file because it is being used by another process.");
    }
}

Autres conseils

Il y a une discussion utile sur Google groupes que vous devriez vraiment lire. L'une des options est proche de Darin de; Cependant, pour vous garantir d'obtenir l'erreur droit win32, vous devriez vraiment appeler le win32 OpenFile () vous API (sinon, vous ne savez vraiment pas quelle erreur vous récupérez).

Une autre est d'analyser le message d'erreur: qui échouera si votre application est exécutée sur une autre version de langue

.

Une troisième option consiste à pirater l'intérieur de la classe d'exception avec la réflexion pour pêcher la HRESULT réelle.

Aucune des alternatives sont vraiment attrayantes: la hiérarchie IOException bénéficierait de quelques autres sous-classes à mon humble avis.

Pour lire les données que vous pouvez faire:

  

à l'aide (FileStream fs = new   FileStream (fileName, FileMode.Open,   FileAccess.Read, FileShare.ReadWrite |   FileShare.Delete)) {....}

et d'enregistrer dans le fichier:

  

à l'aide (FileStream fs = new   FileStream (fileName, FileMode.APPEND,   FileAccess.Write, FileShare.Read |   FileShare.Delete)) {...}

Drapeaux à la fin des constructeurs décrit ce que d'autres processus peut faire avec le fichier. Il est très bien, bien sûr, si vous contrôlez à la fois écriture et de lecture ...

Vous pouvez l'ouvrir (comme décrit par bezieur) puis essayez de verrouiller les sections (ou fichier entier): http://www.java2s.com/Code/VB/File- Répertoire / Lockandunlockafile.htm

Voulez-vous dire que vous êtes à la fois la lecture et l'écriture du fichier? Ou qu'une demande extérieure est en train d'écrire à elle.

Si vous faites la lecture et de l'écriture alors je suppose que vous faites sur différents sujets dans ce cas, un coup d'oeil à la classe ReaderWriteLock qui le fera la gestion pour vous, et vous permettent de fournir des délais d'attente.

http://msdn.microsoft.com/en -nous / bibliothèque / system.threading.readerwriterlock.aspx

Sinon, tout ce que vous devez faire est d'ouvrir le fichier dans un mode lecture seule. Ensuite, vous ne devriez pas avoir de problème:

fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read));

Vous pouvez comparer par rapport au type IOException pour vérifier et voir si ce n'est pas autre chose

Comme

if (ex is FileNotFoundException)

Vous pouvez consulter l'aide sur System.IO. Beaucoup des exceptions en héritant de la classe de IOException . En dehors de vérifier pour voir si elle est un autre type d'exception que vous pourriez avoir à regarder dans le message de la description ou vous pourriez regarder en faisant un appel API Win32 dans shell32.dll. Il peut y avoir une fonction là-bas pour vérifier si un fichier est verrouillé.

En outre, si vous devez absolument vous attendre, vous pouvez utiliser la boucle, mais si vous voulez faire d'autres actions en attendant utiliser un fil asynchrone.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top