2011-01-04 5 views
1

Ich hatte viele Beispiele gesucht, aber keine funktioniert perfekt für mich. Ich benutze C#.Wie erkennt man, dass eine Datei verwendet wird?

Meine Anwendung muss die Dateien im Ordner nur entfernen, wenn die Datei geschlossen ist.

Die try-catch File.Open (...) Methode nur für bestimmte Dateitypen wie doc, xls, ppt, pdf, mp3 etc., aber nicht arbeitet für txt, zip, html etc ...

+0

möglich Duplikat von [C# geöffnet worden sein: gibt es eine Möglichkeit zu überprüfen, Wenn eine Datei verwendet wird?] (http://stackoverflow.com/questions/876473/c-is-there-a-way-to-check-if-a-file-isin-use) –

Antwort

11

Das Verhalten, das Sie sehen, hat nichts mit der Dateierweiterung oder dem Inhalt zu tun. Es hat damit zu tun, wie die zugehörigen Anwendungen diese Dateien behandeln. Zum Beispiel halten Notepad, Internet Explorer usw. eine Sperre für eine geöffnete Datei nicht fest, sobald der Inhalt gelesen wurde. Deshalb können .txt und .html Dateien geöffnet werden.

Microsoft Office, so gut wie alle Media-Player usw. werden die Datei sperren. Im Fall von Office wird dabei sichergestellt, dass andere Programme die Datei nicht löschen oder aus der Datei entfernen. Im Falle eines Medienplayers sind die Dateien normalerweise zu groß, um vollständig in den Speicher gelesen zu werden. Aus diesem Grund sind diese Dateitypen gesperrt, wenn sie verwendet werden.

Mit anderen Worten, die Dateien, die scheinbar nicht verwendet werden, werden nicht tatsächlich verwendet. Das Programm liest die Daten aus der Datei und schließt sie und jetzt ist es damit fertig. Es gibt wirklich keine einfache Möglichkeit festzustellen, ob ein anderes Programm eine bestimmte Datei geöffnet hat oder nicht, wenn es kein geöffnetes Handle mehr zur Datei hat.

+0

Ich verstehe die Logik dahinter, danke für deine Erklärung. Was ich jetzt tun kann, ist die Verwendung von Timer, um die Datei mit der ältesten 'Last Access Time' zu löschen. – VHanded

+0

Eigentlich funktioniert das auch nicht auf Betriebssystemen, bei denen die letzte Zugriffszeit nicht aktiviert ist. Die letzte Zugriffszeit kann in Windows XP deaktiviert werden und ist standardmäßig unter Vista und Windows 7 deaktiviert. – Josh

+0

oh? Danke für die Erinnerung. Wird es ändern. – VHanded

0
arbeitet

Öffnen Sie die Datei im Binärmodus. Datei.Öffnen (...) funktioniert für alle Dateien.

0

Versuchen Sie die Datei im Schreibmodus zu öffnen, ich glaube, es ist etwas, dass die Sperre zu spezifizieren ist aus irgendeinem Grunde exculsive..but wenn der Thread dies..dunno wenn das Schloss automatisch freigegeben werden ...

0

alles, was Sie brauchen, ist die Datei löschen, die nicht verwendet wird ... rigth ... Ignorieren Sie einfach die Ausnahme von File.Delete geworfen. Da es nicht die Datei löscht, die verwendet wird ..

try 
{ 
    File.Delete(path); 
} 
catch(Exception e) 
{ 
// ignore ... or whatever action 
} 

können Sie auch bestimmte Ausnahmen fangen spezifische Maßnahmen zu ergreifen ... wie IOException für Datei in Gebrauch ist, UnauthorizedAccessException nur zum Lesen von Dateien und Berechtigungsprobleme etc. ..

überprüfen Datei zum Öffnen und dann durch einen Prozess möglicherweise noch durch Ausnahme als Datei zu löschen versuchen, zwischen Kontrolle und löschen von Operationen ..

+1

dies wird nicht für bestimmte Anwendung wie Notepad usw. funktionieren, die Sperre auf die Datei nicht gilt. – VHanded

Verwandte Themen