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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top