Prüfen, ob Datei gelesen werden kann
Dies ist, wie ich versucht bin, zu überprüfen, ob ich die Datei Lesen können, bevor Sie tatsächlich Lesen
FileStream stream = new FileStream();
try
{
//try to open the file to check if we can access it for read
stream = File.Open(this.DataSourceFileName, FileMode.Open, FileAccess.Read);
}
catch (IOException ex)
{
return false;
}
finally
{
stream.Dispose();
}
Ist das der richtige Weg?
Ist auch File.Open
ähnlich File.ReadAllText
, was ich meine ist, sind Sie genauso teuer, für die Leistung?
- möglich, Duplikat der wie kann man einfach überprüfen, wenn der Zugriff verweigert wird für eine Datei .NET?
- überprüfen Sie diese Antwort stackoverflow.com/a/876513/1129995
- Datei.Öffnen erstellt ein FileStream-Objekt, das Sie dann verwenden können, um Zugriff auf die Inhalte. Datei.ReadAllText tatsächlich beginnt die streams Verarbeitung intern. Also ja, die Datei.ReadAllText teurer ist.
- Prüfen Sie diese Frage stackoverflow.com/questions/876473/... Auch verwenden
using
File.Open
undFile.ReadAllText
verschiedene Dinge tun. Man öffnet eine Datei, und die andere öffnet es und spielt eine beliebige Anzahl von zusätzlichen arbeiten, damit Sie den Vergleich nicht hilfreich ist. Vielleicht können Sie klären, was Sie bedeuten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ob eine Datei gelesen werden können, hängt von verschiedenen Faktoren ab: haben Sie Berechtigungen, ob die Festplatte defekt ist. Ich wäre wahrscheinlich gegangen, haben die gleiche route wie du.
Aber Sie müssen im Hinterkopf behalten, dass die Informationen, die Sie erhalten, von dieser Methode ist nur eine Momentaufnahme. Wenn sofort nach Aufruf dieser Methode, jemand ändert die Berechtigungen für die Datei, den Zugriff auf die Datei später in deinem code immer noch nicht. Sie sollten nicht davon abhängen, ob das Ergebnis dieser Methode.
Nur ein Vorschlag, der folgende code tut das gleiche, ist aber ein bisschen präziser:
Da bist du nicht wirklich mit dem Strom, Sie don ' T haben, um zu halten eine Referenz auf diese. Stattdessen können Sie einfach sofort entsorgen Sie den Strom durch den Aufruf von dispose auf das Ergebnis
File.Open()
.EDIT:
Sehen https://gist.github.com/pvginkel/56658191c6bf7dac23b3893fa59a35e8 für eine Erklärung, warum ich habe die
Dispose()
am Ende derFile.Open()
anstatt dieusing
- Anweisung..Dispose()
am Ende einer Zeile kann verursachen, Ressourcen-Lecks. Sollten Sie einen using-block statt, um sicherzustellen, dass es geschlossen ist, wenn es eine Ausnahme. Ansonsten ist das Ergebnis derFile.Open()
kann nicht darüber verfügen.using
, aber der obige code macht genau das gleiche, und ist kürzer. Der Grund, den code nicht erstellen kann eine Ressource Speicherverlust ist, dass, wenn eine Ausnahme Auftritt inFile.Open()
Sie nicht in der Lage sein, um Zugriff auf den Rückgabewert irgendwie nicht, weil wenn eine Methode wirft es nicht zurück, nichts. So wird es die Aufgabe derFile.Open()
Methode zu säubern, wenn er wirft.Dispose()
wird nicht aufgerufen, wenn die Datei nicht existiert oder der Benutzer nicht die Berechtigung haben. Eine Verwendung oder ein finally-block sind die einzigen 2 Möglichkeiten, um zu garantierenDispose()
aufgerufen werden, in dem Fall eine Ausnahme. Sie könnte sich ändern, die Linie zuusing (var _ = File.Open(this.DataSourceFileName, FileMode.Open, FileAccess.Read)) {}
und es wäre in Ordnung.File.Open()
wird eine exception werfen. Wenn jede Methode eine Ausnahme auslöst, wird es nichts zurückgibt, so gibt es nichts zu nennen.Dispose()
auf. Wenn Sie z.B. eine Methode, wiepublic IDisposable Method() { throw new Exception("Hi"); return /* something */; }
, diereturn
werden nie ausgeführt, und es wird nichts zurückgegeben. Bitte haben Sie einen Blick auf den link überusing
in der Windows-Dokumentation. Die Seite erklärt es besser als ich können.Wenn Sie prüfen möchten Ausnahmen, fügen Sie einfach die entsprechenden
try..catch
Dan Dinu-code z.B.Du die Lösung sieht gut aus. Sie können auch ein "using" - Anweisung:
Der compiler übersetzt diese in einen try/finally-block und automatisch entsorgt, das Objekt nach dem code-block ausgeführt wird.
Datei nur Öffnen öffnet die Datei zum Lesen/schreiben.
ReadAllText öffnet die Datei, liest den text und schließt es, so dass es länger dauert.; es;s bis zu Ihnen, wählen Sie die Methode geeignet, um Ihren Fall.
using
. Sie sollten nicht zuweisenstream
innerhalb derusing
.