2010-06-07 29 views
16

Gibt es eine Möglichkeit zu finden, ob eine Datei bereits geöffnet ist oder nicht?Überprüfen, ob eine Datei geöffnet ist

+2

Bitte bieten Sie genauere Informationen an. Bereits geöffnet durch Ihren Prozess oder einen anderen Prozess? Geöffnet oder nur mit Schreibzugriff geöffnet? Was ist mit Teilen? usw. Diese Frage ist zu vage. – hemp

Antwort

26
protected virtual bool IsFileinUse(FileInfo file) 
{ 
    FileStream stream = null; 

    try 
    { 
     stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); 
    } 
    catch (IOException) 
    { 
     //the file is unavailable because it is: 
     //still being written to 
     //or being processed by another thread 
     //or does not exist (has already been processed) 
     return true; 
    } 
    finally 
    { 
     if (stream != null) 
     stream.Close(); 
    } 
    return false; 
} 
+2

Wenn der Prozess keinen Schreibzugriff auf die Datei hat, führt dies zu einem irreführenden Ergebnis (das Öffnen schlägt fehl, aber nicht unbedingt, weil ein Handle existiert.) Das Öffnen für den Lesezugriff wäre weniger fehleranfällig. – hemp

+4

Erstaunlich, dass die meisten Sprachen keine Methode zum Testen der Datei haben, ist offen. Wir haben den gleichen Methodentyp unter C++ in OS/2 verwendet. d. h. versuchen, die Datei exklusiv zu öffnen. Es funktioniert gut genug, aber ich habe es nie elegant gedacht. – Matt

+2

Es ist keine Sprachfunktion, es ist eine Betriebssystemfunktion. Es gibt einfach keine einfache API (in Windows), um nach diesen Informationen zu suchen. Es ist möglich zu bekommen, aber es ist Low-Level und es gibt eine Menge von Parametern, die angegeben werden müssten, um zu wissen, was mit "offen" gemeint ist. – hemp

7

Als @pranay rana, aber wir müssen sicherstellen, dass wir in der Nähe unserer Datei-Handle:

public bool IsFileInUse(string path) 
{ 
    if (string.IsNullOrEmpty(path)) 
    throw new ArgumentException("'path' cannot be null or empty.", "path"); 

    try { 
    using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read)) { } 
    } catch (IOException) { 
    return true; 
    } 

    return false; 
} 
+0

Wie @Pranay Rana, ich habe diese Methode getestet, aber es erkennt nicht, wenn die Datei im Editor geöffnet ist . – James

1

Wenn Sie meinen, dass Sie überprüfen möchten, ob eine Datei geöffnet ist, bevor Sie versuchen, es zu öffnen , dann nein. (Zumindest nicht, ohne Low-Level zu gehen und jedes Dateihandle zu untersuchen, das im System offen ist.)

Außerdem wären die Informationen alt, wenn Sie sie bekommen. Selbst wenn der Test zurückgeben würde, dass die Datei nicht geöffnet ist, könnte sie geöffnet worden sein, bevor Sie den Rückgabewert verwenden können.

So ist der richtige Weg, um die Situation zu behandeln, zu versuchen, die Datei zu öffnen, und jeden Fehler behandeln, als möglicherweise auftreten.

0

Einverstanden. Ich würde eine designierte Klasse erstellen, die die offene Dateilogik oder zumindest den Test (IsFileAvailable) umschließt. Dadurch können Sie die Ausnahmemanagement mit einer Klasse speziell verantwortlich machen und wiederverwendbar machen. Sie können sogar weitere Logik anwenden, z. B. die Dateigröße testen, um zu sehen, ob die Datei in etc geschrieben wird, um eine detailliertere Antwort zu geben. Es wird auch Ihren Code viel sauberer machen.

Verwandte Themen