wie man am besten warten, bis eine filelock freizugeben
-
22-08-2019 - |
Frage
Ich habe eine Anwendung, wo ich manchmal aus Datei lesen müssen und dadurch erfasst werden kann geschrieben werden. Wie ich von anderen Fragen verstanden haben ich sollte die IOException fangen und versuchen Sie es erneut bis ich lesen kann.
Aber meine Frage ist, wie kann ich sicher wissen, dass die Datei gesperrt ist und dass es nicht eine andere IOExcetpion ist, die auftritt.
Lösung
Wenn Sie eine Datei öffnen für in .NET liest irgendwann versuchen, eine Datei-Handelte mit dem Create API-Funktion, die die Fehlercode die verwendet werden können, um zu sehen, warum es fehlgeschlagen:
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.");
}
}
Andere Tipps
Es gibt eine nützliche Diskussion über google Groups , die Sie wirklich lesen sollte. Eine der Optionen ist an Darins schließen; jedoch garantieren Ihnen, die richtige win32 Fehlermeldung erhalten, sollten Sie wirklich die win32 Openfile () aufrufen, selbst API (sonst, die Sie wirklich nicht wissen, welche Fehler Sie abrufen).
Ein weiterer Grund ist die Fehlermeldung zu analysieren: Das wird fehlschlagen, wenn Ihre Anwendung auf einer anderen Sprachversion ausgeführt wird,
.Eine dritte Option ist innerhalb der Ausnahmeklasse mit Reflexion hacken die tatsächlichen HRESULT heraus zu fischen.
Keine der Alternativen sind wirklich so attraktiv: die IOException Hierarchie von einigen mehr Subklassen IMHO profitieren würden.
Um Daten lesen Sie tun können:
mit (Filestream fs = new Filestream (filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete)) {....}
und in der Datei zu speichern:
mit (Filestream fs = new Filestream (filename, FileMode.APPEND, FileAccess.Write, FileShare.Read | FileShare.Delete)) {...}
Flaggen am Ende des Konstrukteurs beschreiben, was andere Verfahren mit der Datei tun können. Es ist in Ordnung, natürlich, wenn Sie beide Schreib steuern und lesen ...
Sie können es öffnen (wie durch bezieur beschrieben) dann versuchen, Abschnitte zu sperren (oder ganze Datei): http://www.java2s.com/Code/VB/File- Verzeichnis / Lockandunlockafile.htm
Haben Sie meinen Sie sind sowohl das Lesen und Schreiben in die Datei? Oder dass eine externe Anwendung auf sie schreibt.
Wenn Sie das Lesen tun, und das Schreiben dann gehe ich davon aus Sie es in verschiedenen Threads tun in diesem Fall einen Blick auf die ReaderWriteLock Klasse nehmen, die für Sie das das Management tun wird, und ermöglicht es Ihnen, Timeouts zu bieten.
http://msdn.microsoft.com/en -US / library / system.threading.readerwriterlock.aspx
Ansonsten alles, was Sie tun müssen, ist die Datei in einem lesen nur öffnen Modus. Dann sollten Sie keine Probleme haben:
fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read));
Sie können vergleichen gegen den Typ IOException zu überprüfen und sehen, ob es nicht etwas anderes
Wie
if (ex is FileNotFoundException)
Sie können die Hilfe auf System.IO nachschlagen möchten. Viele der Ausnahmen in dieser Klasse erben von IOException . Außerhalb der Überprüfung, ob es eine andere Art von Ausnahme ist, können Sie in der Nachricht von der Beschreibung suchen oder Sie können einen Win32-API-Aufruf in der Herstellung in shell32.dll suchen. Es kann eine Funktion in es zu überprüfen, ob eine Datei gesperrt ist.
Auch wenn Sie unbedingt warten müssen Sie Schleife verwenden können, aber wenn Sie andere Aktionen machen wollen, während einen asynchronen Thread warten verwenden.