Datei von einem anderen Prozess belegt? Wie man es in C# überprüft (Tutorial)

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Datei lässt sich hartnäckig nicht öffnen? Wir klären "file in use" in C#



Jeder C#-Entwickler stößt früher oder später auf diese Situation: Sie versuchen, eine Datei zu lesen, zum Schreiben zu öffnen oder einfach zu kopieren, und das Programm stürzt mit einem IOException ab. Die Meldung lautet meistens: "The process cannot access the file because it is being used by another process". Kommt Ihnen bekannt vor? Wenn Sie sich gefragt haben «Is there a way to check if a file is in use?» – sind Sie hier genau richtig. In diesem Tutorial behandeln wir nicht nur abstrakte Ratschläge, sondern echte, funktionierende Lösungen in C#, die Ihre Nerven und Zeit schonen.



Dieses Problem ist eine echte Plage für Anfänger. Es scheint, als ob die Datei "frei" sein sollte, aber das System verweigert hartnäckig den Zugriff. Meistens passiert dies, wenn die Datei:



  • In einem anderen Programm geöffnet ist (Notepad, Excel, IDE).
  • Bereits von Ihrer eigenen Anwendung in einem anderen Thread beansprucht wird.
  • Durch ein Antivirenprogramm oder einen Systemprozess gesperrt ist.


Aber das wichtigste Geheimnis, das Sie jetzt lernen sollten: In reinem .NET gibt es keine magische Methode File.IsInUse(). Alles, was wir tun können, ist zu versuchen, die Datei zu öffnen und den Fehler ordnungsgemäß zu behandeln. Klingt grob? Dafür ist es zuverlässig. Los geht's!



Warum Sie Google nicht glauben sollten: Mythen entlarven



Wenn Sie nach einer Antwort auf die Frage «Wie überprüft man, ob eine Datei verwendet wird» suchen, stoßen Sie auf eine Menge Ratschläge wie "verwende File.GetAccessControl()" oder "überprüfe es über WMI". Vergessen Sie es. Die erste Variante betrifft Zugriffsrechte, nicht Sperrungen. Die zweite ist ein höllischer Overhead für eine einfache Überprüfung. Die reale, über Jahre bewährte Methode ist der Versuch, die Datei mit exklusivem Zugriff zu öffnen. Wenn es klappt – gehört die Datei Ihnen. Wenn nicht – ist sie belegt.



Methode Nr. 1: Klassischer Öffnungsversuch (Try-Catch)



Dies ist der einfachste und verständlichste Ansatz. Wir versuchen, die Datei mit einem FileStream im Modus FileShare.None zu öffnen. Wenn die Datei belegt ist, wird ein IOException ausgelöst. Wir fangen ihn ab und ziehen Schlüsse.



public static bool IsFileInUse(string filePath){    try    {        using (FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.None))        {            // Datei erfolgreich geöffnet, niemand blockiert sie            return false;        }    }    catch (IOException)    {        // Datei nicht verfügbar – höchstwahrscheinlich belegt        return true;    }    catch (UnauthorizedAccessException)    {        // Keine Leserechte – betrachten wir auch als "belegt"        return true;    }}


Wie verwendet man das? Ganz einfach:



string path = @"C:\\temp\\important.docx";if (IsFileInUse(path)){    Console.WriteLine("Datei ist belegt. Bitte schließen Sie sie in anderen Programmen.");}else{    Console.WriteLine("Datei ist frei! Sie können arbeiten.");}


Vorteile der Methode: Prägnanz, Verständlichkeit, funktioniert auf allen .NET-Versionen. Nachteile: Sie lösen bei jedem Aufruf trotzdem eine Ausnahme aus, was bei Massenüberprüfungen langsam sein kann. Für 90% der Aufgaben reicht dies jedoch völlig aus.



Wichtige Nuance: Was tun, wenn die Datei belegt ist?



Das häufigste Szenario – Sie versuchen, Daten in eine Datei zu schreiben, die bereits vom Benutzer geöffnet ist. In diesem Fall reicht es nicht, einfach "belegt" zu sagen. Sie müssen entweder warten oder den Benutzer auffordern, die Datei zu schließen. Hier ist ein Beispiel mit Warten:



public static bool WaitForFile(string filePath, int timeoutMs = 5000){    var sw = System.Diagnostics.Stopwatch.StartNew();    while (sw.ElapsedMilliseconds < timeoutMs)    {        if (!IsFileInUse(filePath))            return true;        Thread.Sleep(200); // Pause 200 ms    }    return false; // Wartezeit abgelaufen}


Dieses Muster wird häufig in Serveranwendungen verwendet, wenn man darauf warten muss, dass eine Datei freigegeben wird.

Blogs

Buchempfehlungen