Meiner Erfahrung nach möchte man dies in der Regel tun, dann seine Dateien "schützen", um etwas Ausgefallenes zu tun, und dann die "geschützten" Dateien verwenden. Wenn Sie nur eine Datei haben, die Sie auf diese Weise verwenden wollen, können Sie den Trick anwenden, der in der Antwort von Jeremy Thompson erklärt wird. Wenn Sie jedoch versuchen, dies mit vielen Dateien zu tun (z. B. wenn Sie ein Installationsprogramm schreiben), werden Sie ziemlich viel Ärger bekommen.
Eine sehr elegante Lösung für dieses Problem ist die Tatsache, dass Ihr Dateisystem es nicht zulässt, einen Ordnernamen zu ändern, wenn eine der darin enthaltenen Dateien bereits verwendet wird. Behalten Sie den Ordner im gleichen Dateisystem, und es wird wie ein Zauber funktionieren.
Bitte beachten Sie, dass Sie sich der offensichtlichen Möglichkeiten bewusst sein sollten, wie dies ausgenutzt werden kann. Immerhin werden die Dateien nicht gesperrt. Beachten Sie auch, dass es andere Gründe gibt, die dazu führen können, dass Ihre Move
Operation scheitert. Natürlich kann eine angemessene Fehlerbehandlung (MSDN) hier helfen.
var originalFolder = @"c:\myHugeCollectionOfFiles"; // your folder name here
var someFolder = Path.Combine(originalFolder, "..", Guid.NewGuid().ToString("N"));
try
{
Directory.Move(originalFolder, someFolder);
// Use files
}
catch // TODO: proper exception handling
{
// Inform user, take action
}
finally
{
Directory.Move(someFolder, originalFolder);
}
Für einzelne Dateien würde ich mich an den von Jeremy Thompson gemachten Vorschlag halten, die Dateien zu sperren.
35 Stimmen
Sie können dies testen, indem Sie alle offenen Handles auf dem System untersuchen. Da es sich bei Windows jedoch um ein Multitasking-Betriebssystem handelt, besteht die Möglichkeit, dass direkt nach der Ausführung des Codes, mit dem festgestellt werden soll, ob die Datei geöffnet ist, ein Prozesscode mit der Verwendung dieser Datei beginnt und zu dem Zeitpunkt, zu dem Sie versuchen, sie zu verwenden, ein Fehler auftritt. Es ist jedoch nicht verkehrt, zuerst zu prüfen, ob die Datei geöffnet ist; gehen Sie nur nicht davon aus, dass sie nicht verwendet wird, wenn Sie sie tatsächlich benötigen.
6 Stimmen
Aber gerade für dieses spezielle Problem würde ich empfehlen, die Dateihandles nicht zu untersuchen und nur eine bestimmte Anzahl von Versuchen durchzuführen, z. B. 3-5, bevor sie fehlschlagen.
0 Stimmen
Wie wird diese Bilddatei erstellt? Können Sie Ihr Programm anhalten/schlafen/pausieren, bis die Erzeugung abgeschlossen ist? Das ist bei weitem der bessere Weg, um die Situation zu bewältigen. Wenn nicht, dann glaube ich nicht, dass Sie eine Ausnahmebehandlung vermeiden können.
0 Stimmen
Ist nicht jede Verwendung von Ausnahmen eine Überprüfung einer Annahme, indem man etwas potenziell Gefährliches tut und dabei absichtlich die Möglichkeit eines Fehlschlags nicht ausschließt?
40 Stimmen
Ihre Philosophie hat ein schlechtes Verständnis von Ausnahmen. Die meisten Leute denken, Ausnahmen bedeuten heilige Scheiße-aus-dem-Doom-irgendetwas-ist-falsch-die-die-die. Wenn Ausnahme bedeutet.... Ausnahme. Es bedeutet, dass etwas Außergewöhnliches passiert ist, das Sie "behandeln" (oder berücksichtigen) müssen. Vielleicht wollen Sie den Datenzugriff immer wieder versuchen, vielleicht muss der Benutzer wissen, dass Sie keine Verbindung herstellen können. Was tun Sie dann? Sie behandeln die ConnectionFailedException und benachrichtigen den Benutzer, so dass er vielleicht nach einer Stunde aufhört, es zu versuchen, und bemerkt, dass das Kabel ausgesteckt ist.
0 Stimmen
Warum die Prüfung und Verarbeitung in verschiedenen Prozeduren? try {open file in FileShare.None; process file; close file} catch {filelocked) {///locked, we'll get it next time}
2 Stimmen
Lee Louviere hat eine berechtigte Abneigung dagegen, mit Ausnahmen zu arbeiten. Wenn man mit der filexists-Methode leicht herausfinden kann, ob eine Datei existiert, gibt es dann einen ähnlichen Befehl, um herauszufinden, ob die Datei, mit der man arbeiten möchte, in Gebrauch ist? Ich glaube, das ist die eigentliche Frage, die der Benutzer stellt.
1 Stimmen
@webs Manche Ausnahmen sind einfach eine Tatsache. Die Verwendung von File.Exists() ist gut, aber wie die Antwort sagt, ist es nicht immer möglich, sie zu vermeiden. Zum Beispiel könnte eine Datei zwischen dem Zeitpunkt, an dem Sie prüfen, ob sie existiert, und dem Zeitpunkt, an dem Sie sie tatsächlich öffnen, existieren. Diese unbestimmte Zeitspanne ist in den meisten Fällen gut genug, aber es gibt keine Garantien und daher sollte ein Exception-Handler den Aufruf zum Öffnen der Datei einschließen usw.
1 Stimmen
@webs Wenn Sie leicht filexists Methode verwenden können, um zu wissen, ob eine Datei vorhanden ist, was ähnlichen Befehl vorhanden ist, um zu wissen, ob die Datei, die Sie mit arbeiten möchten, in Gebrauch ist? Ich bin etwas spät dran, aber diese beiden Beispiele sind TOCTOU-Wanzen . Die Ergebnisse sind sofort ungültig. "Check-then-do" ist nutzlos - der "Check" kann nicht mit dem "Do" identisch sein, so dass der "Check" aus unterschiedlichen Gründen fehlschlagen oder erfolgreich sein kann, wenn der "Do" fehlschlagen würde. Wenn Sie eine Datei öffnen müssen DATEI ÖFFNEN . Nichts anderes kann Ihnen einen endgültigen Beweis dafür liefern, dass die Öffnung funktionieren wird.
2 Stimmen
Was ist, wenn ich nicht herausfinden möchte, ob ich überhaupt in eine Datei schreiben KANN, sondern ob ich lieber nicht schreiben sollte, obwohl ich es könnte, weil jemand anderes gerade an derselben Datei arbeitet?