Montag, 26. November 2012

Was man erwartet und was man bekommt...

Als ich das erste Mal mit der Aufgabe in Berührung kam Dateien und Verzeichnisse aus einem gegebenen Verzeichnis zu ermitteln stieß ich auf die Möglichkeit das mit der statischen Klasse Directory und den entsprechenden Methoden GetFiles und GetDirectories zu tun. Diese Methoden bekommen das zu durchsuchende Verzeichnis, evtl. einen Suchstring und auch optional eine SearchOption. Die Dokumentation besagt, dass alle Dateien (bzw. Verzeichnisse) innerhalb des angegebenen Pfads ermittelt und als string[] zurückgegeben werden. Das habe ich geglaubt und es hat auch bis zu einem Verhängnisvollen Tag problemlos funktioniert. An diesem sehr ernüchternden Tag war ich dabei zu erforschen warum ein, von mir entwickeltes Modul zum Löschen von Dateien und Verzeichnissen nicht ordnungsgemäß funktionierte. Als ich so fröhlich debuggte und in alle möglichen und unmöglichen else- und case-Zweige beine Breakpoints setzte lief ich tatsächlich in einen solchen hinein. Allerdings war die Meldung der Exception höchst verwunderlich, denn dort hieß es "Die Datei kann nicht gelöscht werden, da es sich um ein Verzeichnis handelt". Mit diesem Verzeichnis versuchte ich nämlich File.Delete aufzurufen. Zuvor hatte ich aber alle Dateien mithilfe von Directory.GetFiles aus dem Verzeichnis geholt. Also konnte es der Logik entsprechend nicht sein, dass es sich bei der Datei um ein Verzeichnis handelte.

Dies bedurfte weiterer Forschung. Es handelte sich tatsächlich um ein Verzeichnis in dessen Namen ein Punkt enthalten war. Nun stellte sich die Frage, wenn Verzeichnisse mit Punkt nun als Dateien interpretiert werden, was ist mit Dateien ohne Dateiendung? Die Überprüfung dessen zeigte, dass eben diese Dateien als Verzeichnisse interpretiert wurden. Verlässt man sich nun also darauf, dass die Methoden Directory.GetFiles und Dierectory.GetDirectories die erwarteten Daten (nämlich nur Dateien oder nur Verzeichnisse) zurück geben kann man, so wie ich, Probleme bekommen. Ob dieses Verhalten nun richtig oder falsch ist möchte ich hir nicht beurteilen, allerdings ist dieses Verhalten nicht das von mir erwartete.

Braucht man nun also alle Dateien oder Unterverzeichnisse sollte man hier auf die Klasse DirectoryInfo zurückgreifen. Dies hat zwei Schwächen, zum ersten handelt es sich nicht um eine statische Klasse (im Gegenteil zu Directory), was bedeutet, dass immer eine Instanz erstellt werden muss. Zum zweiten bekommt man hier ein FileInfo-Array (bei GetFiles) und ein DirectoryInfo-Array (bei GetDirectories). Mithilfe der Eigenschaft FullName kann dann der Pfad mit Datei-/Verzeichnis-Namen ermittelt werden.

Fazit: Wenn man fremden Code verwendet kann man sich nicht drauf verlassen, dass was man bekommt auch das ist, was man erwartet.