Hereingefallen: Dir, Directory.GetFiles, Wildcards und 8.3 Format

Ich war eigentlich der Meinung, dass ich mich mit der Kommandozeile ganz gut auskenne – zu mindestens was die Grundlegenden Befehle betreffen. Immerhin bin ich mit DOS 5.0 groß geworden und auch während meiner Ausbildung wurde mir das bestätigt bzw. ich konnte dort mein Wissen wieder auffrischen und sogar noch ein wenig vertiefen und erweitern. Trotzdem war ich etwas überrascht als vor einigen Wochen plötzlich ein Problem aufgetreten ist:

MEF ist wirklich sehr praktisch, wenn es darum geht Anwendungen über Plugins zu erweitern. Häufig nutze ich dafür einen DirectoryCatalog. Der Aufruf sieht in etwa so aus:

1
var catalog = new DirectoryCatalog(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)), "*.dll");

So weit so gut. Was man bei diesem Aufruf aber wissen sollten – hier werden nicht nur ‚dll‘ Dateien gefunden! Bei einem Projekt hatten wir im selben Verzeichnis auch ‚Backup-Dateien‘ mit der Endung ‚dllx‘. Ich – und auch meine Kollegen – waren sehr überrascht, dass diese ebenfalls geladen wurden. Wenn man sich ein wenig durch das MSDN klickt findet man die Erklärung dafür unter der Directory.GetFiles Methode. Dort gibt es – extra farbig hinterlegt – einen Hinweis:

Bei Verwendung des Platzhalterzeichens Sternchen in einem searchPattern, z. B. „*.txt“, ist das Vergleichsverhalten, wenn die Erweiterung genau drei Zeichen lang ist, anders als wenn die Erweiterung mehr oder weniger als drei Zeichen lang ist. Ein searchPattern mit einer Dateierweiterung von genau 3 Zeichen gibt Dateien mit einer Erweiterung von drei oder mehr Zeichen zurück, wobei die ersten drei Zeichen der Dateierweiterung den in searchPattern angegebenen Zeichen entsprechen.

Natürlich war aber der erste Schritt nicht das MSDN zu durchforsten, sondern das Problem zu lösen. Jedoch fragte ich mich: Wie verhält sich der ‚dir‘ Befehl hierbei eigentlich? Die Frage lässt sich gar nicht so schnell beantworten, wie man vermuten lässt. Ich habe auf meinem Laptop gleich mal die Kommandozeile (Start -> Ausführen -> CMD) geöffnet und ein paar Dummy-Dateien angelegt und das ganze ausprobiert. Ich war verblüfft. Auch hier werden beim Aufruf von dir *.txt sowohl die ‚txt‘ als auch die ‚txt2‘ Dateien gefunden.

Kommandozeile

Von diesem Ergebnis wollte ich mich aber nicht zu sehr beeindrucken lassen. Hallo! Das wäre mir doch früher schon mal aufgefallen, oder? Also zu Hause an meinem PC das ebenfalls ausprobiert. Ihr könnt euch sicher denken, was passiert ist, oder? An meinem PC zu Hause wird nur die ‚txt‘ Datei gefunden – nicht aber die ‚txt2‘. Somit war ich komplett verwirrt.

Kommandozeile

Mein Kollege hatte dann noch den entscheidenden Hinweis: Rufe doch mal ‚dir‘ mit dem Parameter ‚/x‘ auf. Auf meinem Laptop bot sich dann folgendes Bild:

Kommandozeile

Hier wird der Dateiname auch im klassischen ‚8.3 Format‚ angezeigt. Dieses Format ist mir natürlich nicht ganz unbekannt. Jedoch, wie der Name schon sagt und das Bild auch zeigt: Hier hat die Dateiendung nur drei Zeichen. Zu Hause hab‘ ich das dann gleich bei meinem PC ausprobiert und siehe da:

Kommandozeile

Hier gibt es keinen Eintrag für das ‚8.3 Format‘. Also liegt darin der Unterschied. Ist das 8.3 Format aktiviert, so verhält sich der ‚dir‘ Befehl wie das SearchPattern bei Directory.GetFiles. Ist das 8.3 Format deaktiviert kann man sich sicher sein, dass man nur die gewünschten Dateien findet. Jetzt sind aber noch zwei Fragen offen.


Frage 1: Wie (de-)aktiviert man das 8.3 Format?

Antwort: Wollt ihr raten? Natürlich in der Registry.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem
Dort muss ein neuer Dword-Wert angelegt werden, falls dieser nicht existiert: NtfsDisable8dot3NameCreation
0 = deaktiviert, 1 = aktiviert


Frage 2: Lässt sich Directory.GetFiles auch von der Einstellung beeinflussen?

Antwort: Ja. Das wird zwar in der MSDN so nicht explizit geschrieben, aber aus einem zweiten Hinweis kann man das entnehmen:

Da diese Methode Dateinamen mit dem Dateinamenformat 8.3 und dem langen Dateinamenformat überprüft, werden beim Suchmuster „*1*.txt“ möglicherweise unerwartete Dateinamen zurückgegeben. Beim Suchmuster „*1*.txt“ wird z. B. „longfilename.txt“ zurückgegeben, da das entsprechende 8.3-Dateinamenformat „LONGFI~1.TXT“ lautet.

Somit sollten die wichtigsten Fragen mal geklärt sein – nochmal Falle ich darauf nicht herein …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.