2012-12-31 9 views
19

Mi sono appena imbattuto in un comportamento non documentato dei metodi GetFiles in System.IO.Directory.Directory.GetFiles trova file inesistenti

Ogni volta che il parametro searchPattern passato al metodo contiene un nome di dispositivo Windows riservato, come ad esempio "nul.*" o "aux.bmp", il metodo restituisce un array che contiene il nome di un file inesistente, come C:\Users\ft1\nul o D:\aux, ecc

I Mi chiedo se quei nomi dei dispositivi abbiano un significato speciale in quel contesto, come "." o "..", o se questa è solo una specie di bug. Ad ogni modo, sembra ancora piuttosto strano. Ad esempio, questo frammento di codice in C#:

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

stampe

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

Degli indizi?

risposta

28

Questo è noto. Si tratta di un design del sistema operativo per quanto riguarda Naming Files, Paths, and Namespaces (Windows)

Estratto:

Non utilizzare i seguenti nomi riservati per il nome di un file: CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4 COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 e LPT9. Evita anche questi nomi seguiti immediatamente da un'estensione; ad esempio, NUL.txt non è raccomandato. Per ulteriori informazioni, vedere Namespace.

Questi sono sostanzialmente nomi alias (spazi dei nomi), quindi sono sempre presenti globalmente (in ogni cartella). Se tenti di enumerarli, li riavrai perché esistono.

+1

Sapete se il .NET Framework ha alcuna lista built-in di tali nomi riservati? –

+6

Questa è una buona domanda, probabilmente sarebbe meglio chiederla come una vera domanda SO, ma dato che la domanda [Come verificare se una determinata stringa è legale (permesso) nome file sotto Windows?] (Http://stackoverflow.com/questions/62771/how-check-if-given-string-is-legal-allowed-file-name-under-windows) è già stato chiesto, ti darò il link. –

+0

Grazie mille Erik! –

10

Questi sono reserved words di MSDOS/NTFS.

Da Wikipedia:

Inoltre, nelle utilities Windows e DOS, alcune parole potrebbe anche essere riservata e non possono essere utilizzati come nomi di file. Ad esempio, i file di dispositivo DOS:

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. 

sistemi che hanno queste restrizioni provocare incompatibilità con alcuni altri filesystem. Ad esempio, Windows mancherà di gestire o generare report di errore per questi nomi di file UNIX legali: aux.c, q "uote" s.txt o NUL.txt.

nomi di file NTFS che vengono utilizzati internamente includono:

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

Grazie, sapevo dei nomi MSDOS riservati ma quei nomi di file NTFS interni sono nuovi per me. Dovrò dare loro un'occhiata perché penso che potrebbero anche causare problemi nella mia applicazione. –

Problemi correlati