Warum ist die Datei.Exists() viel langsamer, wenn die Datei nicht vorhanden ist?
Scheint mir, dass Datei.Exists() ist deutlich langsamer, wenn die Datei nicht existiert oder der Benutzer keinen Zugriff hat, als wenn die Datei existiert.
ist das wahr?
Macht das keinen Sinn für mich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im Allgemeinen, wenn Sie suchen eine Reihe von Sachen, für etwas, Sie können nicht sicher sein über Ihre mangelnde Existenz, es sei denn, Sie haben nach allen möglichen Orten es gewesen sein könnte. Bei der Suche nach etwas, das (in den meisten Arten von Sammlungen) der Schlimmste Fall ist, wenn das Element nicht in der Sammlung existieren.
Habe ich nicht getestet
File.Exists
im besonderen aus, aber ich bezweifle stark, dass es da einen wirklich merklichen Unterschied in diesen Fällen, es sei denn, du tust es Tausende Male. Wie kommen Sie zu dieser Schlussfolgerung?List<T>.Contains
.File.Exists
? Es war absolut wieC:\Windows\Notepad.exe
oder war es wie.\My\File.txt
?File.Exists
trapping Ausnahmen. Der Aufwand der Aufzucht und der Aufnahme einer Ausnahme kann dazu beitragen, schlechte Leistung.File.Exists
funktioniert wie folgt:Überprüfen, um zu sehen, ob die Datei vorhanden ist, versucht es, die Datei zu öffnen... wenn eine Ausnahme geworfen wird, ist die Datei nicht vorhanden ist.
Dieser Prozess ist langsamer als das öffnen einer Datei und keine Ausnahme geworfen wird (das heißt, wenn die Datei existiert).
File.Exists
auch instanziiert CLR permissioning, bevor Sie die Datei existiert die Datei. Eine alternative (obwohl ich habe nicht versucht, für die Leistung) ist PathFileExists, wenn Sie tun eine Menge von Prüfungen:Lief ich den folgenden test, und auf meinem PC zumindest, die Zeiten sind ungefähr die gleichen:
Wurden die Ergebnisse entlang der Linien der folgenden (jeder Lauf ist etwas anders, aber etwa gleich):
Aber über ein Netzwerk (auf dem LAN zu einem server ein hop entfernt), fand ich den test ganz ein bisschen langsamer, wenn die Dateien eigentlich vorhanden sind. Ich schnupperte und es war nur ein SMB-Paket jeder Richtung.
Datei und alle Ihre Methoden in der Regel die Arbeit mit windows-Datei-handles.
Wenn Sie eine Menge von Schecks, die Sie verwenden sollten :
Statt arbeiten intern mit Datei-handles, sieht es so aus, Datei-Attribute und ist viel schneller. Außerdem prüft es nicht für Ausnahmen, die eine große Verlangsamung .NET
FileInfo.Exists
letztlich macht die gleichen Anrufe wieFile.Exists
. (Mit dem Reflektor, kann man sehen, dass es zum ausführenFillAttributeInfo
und öffnen Sie eineSafeFindHandle
, wieFile.Exists
).