Wird eine Datei bereits genutzt?

Veröffentlicht: 20. Jul 2005

Von Mathias Schiffer

Dieser MSDN Quickie zeigt, wie Sie ermitteln können, ob eine Datei bereits von einer anderen Anwendung geöffnet ist.

Ein klassisches Kollisionsproblem: Was soll eigentlich passieren, wenn eine Datei von mehreren Anwendungen gleichzeitig geöffnet ist? Wer kommt dann beim Speichern der Datei zum Zug? Der erste Speichernde? Derjenige, der die Datei zuerst geladen hat? Oder wird das parallele Öffnen a priori unterbunden? Ganz egal, welche Antwort Sie für Ihre Anwendung wählen: Die notwendige Information ist, ob eine Datei bereits von einer anderen Anwendung verwendet wird.

Der Schlüssel ist die Option, eine Datei exklusiv öffnen zu können. Diese Exklusivität lässt sich noch dazu für Schreib- und für Lesezugriff einzeln anfordern. Gelingt ein exklusiver Zugriff, so wird die Datei im Moment des Zugriffs von keiner anderen Anwendung offen gehalten - der Umkehrschluss gilt allerdings nicht. So lange Sie die Datei im exklusiven Zugriff halten, genießen Sie darüber hinaus auch ein Vorrecht, das anderen Anwendungen ein Lesen und/oder Schreiben dieser Datei verweigert.

Die folgende Funktion IsFileInUse nutzt die Möglichkeit, eine Datei exklusiv öffnen zu können - bzw. dies versuchen zu können - zum entsprechenden Erkenntnisgewinn über eine Fehlerprüfung aus.

Public Function IsFileInUse(ByVal fullFilePath As String) As Boolean
    ' Gibt zurück, ob die übergebene Datei momentan exklusiv zu haben ist.
    ' Prüft, ob die angegeben Datei aktuell durch eine
    ' andere Anwendung in Benutzung ist
    Dim ff As Integer = FreeFile()
  
    If System.IO.File.Exists(fullFilePath) Then
  
      Try
        ' Versuchen, die Datei mit *exklusiven* Lese- und
        ' Schreibrechten zu öffnen
        FileOpen(ff, fullFilePath, OpenMode.Binary, _
                                   OpenAccess.ReadWrite, _
                                   OpenShare.LockReadWrite)
  
      Catch
  
        ' Ist ein Fehler aufgetreten, so wird nach außen hin generell
        ' davon ausgegangen, dass die Datei in Benutzung ist (obwohl
        ' auch andere Ursachen, etwa Rechteprobleme, möglich sind).
        IsFileInUse = True
  
      Finally
  
        ' Die eventuell geöffnete Datei schließen
        FileClose(ff)
  
      End Try
  
    End If
  
  End Function

Tipp:
Einige Anwendungen öffnen eine Datei, lesen deren Informationen aus und schließen die Datei sofort wieder, während die Dateiinhalte in der Anwendung zur Bearbeitung zur Verfügung gestellt bleiben. Erst für das Speichern der bearbeiteten Inhalte öffnen diese Anwendungen die Datei wieder zum Schreiben. Beispiele für solche Anwendungen sind Microsoft Word oder der Microsoft Texteditor "notepad.exe". In solchen Fällen ist die Datei nicht als von einer anderen Anwendung geöffnet erkennbar, obwohl ihre Inhalte aktuell in Bearbeitung sein können.

Mathias Schiffer widmet sich als freier Softwareentwickler und Technologievermittler größeren Projekten ebenso wie arbeitserleichternden Alltagslösungen. Seit Jahren gibt er sein Wissen in unzähligen Publikationen und Beratungen auch an andere Entwickler und Entscheider weiter. Sie erreichen ihn per E-Mail an die Adresse Schiffer@mvps.org.