2012-12-31 12 views
19

Ich stolperte gerade über ein undokumentiertes Verhalten der GetFiles Methoden in System.IO.Directory.Directory.GetFiles findet nicht existierende Dateien

Immer wenn die searchPattern Parameter an die Methode übergeben enthalten ein Windows-reservierten Gerätenamen, wie "nul.*" oder "aux.bmp", wobei das Verfahren ein Array mit dem Namen einer Datei enthält, nonexisting zurückgibt, wie C:\Users\ft1\nul oder D:\aux usw.

I frage mich, ob diese Gerätenamen eine besondere Bedeutung haben, wie "." oder "..", oder wenn das nur eine Art Bug ist. Wie auch immer, das scheint immer noch ziemlich seltsam zu sein. Zum Beispiel dieser Code-Schnipsel in C#:

string[] fileNames = Directory.GetFiles(@"C:\D:\..\..\...\", "con.txt"); 
foreach (string fileName in fileNames) Console.WriteLine(fileName); 

druckt

C:\D:\..\..\...\con 

Irgendwelche Hinweise?

Antwort

28

Dies ist bekannt. Es ist ein Betriebssystem-Design in Bezug auf Naming Files, Paths, and Namespaces (Windows)

Auszug:

Verwenden Sie die folgenden reservierten Namen nicht für den Namen einer Datei: CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4 , COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 und LPT9. Vermeiden Sie auch diese Namen sofort gefolgt von einer Erweiterung; Zum Beispiel wird NUL.txt nicht empfohlen. Weitere Informationen finden Sie unter Namespaces.

Dies sind im Grunde Dateinamen Aliasnamen (Namespaces), so dass sie immer global (in jedem Ordner) existieren. Wenn Sie versuchen, sie aufzulisten, erhalten Sie sie zurück, weil sie existieren.

+1

Sie wissen Sie, wenn das .NET Framework jede eingebaute Liste solcher reservierten Namen hat? –

+6

Das ist eine gute Frage, es wäre wahrscheinlich besser, das als eine tatsächliche SO Frage zu stellen, aber da die Frage [Wie prüfen, ob gegebener String legaler (zulässiger) Dateiname unter Windows ist?] (Http://stackoverflow.com/questions/62771/how-check-wenn-gegeben-string-is-legal-allowed-file-name-under-windows) ist bereits gefragt, ich gebe dir den Link. –

+0

Vielen Dank Erik! –

10

Dies sind reserved words von MSDOS/NTFS.

Von Wikipedia:

Zusätzlich in Windows und DOS-Dienstprogramme, könnten einige Wörter auch reserviert werden und nicht als Dateinamen verwendet werden können. Beispiel: DOS-Gerätedateien:

CON, PRN, AUX, CLOCK$, NUL 
COM0, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9 
LPT0, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9. 

Systeme, die diese Einschränkungen aufweisen, verursachen Inkompatibilitäten mit einigen anderen Dateisystemen. Zum Beispiel wird Windows nicht mit diesen legalen UNIX-Dateinamen umgehen oder Fehlermeldungen ausgeben: aux.c, q "uote" s.txt oder NUL.txt.

NTFS-Dateinamen, die intern verwendet werden, umfassen:

$Mft, $MftMirr, $LogFile, $Volume, $AttrDef, $Bitmap, $Boot, $BadClus, $Secure, 
$Upcase, $Extend, $Quota, $ObjId and $Reparse 
+0

Danke, ich wusste von den reservierten MSDOS-Namen, aber diese internen NTFS-Dateinamen sind neu für mich. Ich muss ihnen einen Blick geben, da sie meiner Meinung nach auch Probleme bei meiner Bewerbung verursachen können. –