2012-01-10 14 views
6

Recentemente mi sono imbattuto in una strana funzionalità da Microsoft:funzionalità Strano in Directory.GetFiles di NET() quando modello di ricerca contiene 3 caratteri per l'estensione

Assumiamo la nostra cartella c:\tmp123 contiene 3 file -
1.txt
2.txtx
3.txtxt

a) Invocazione di Directory.GetFiles(@"C:\tmp123", "*.txt") rese in 3 articoli restituiti.
b) Invocazione di Directory.GetFiles(@"C:\tmp123", "*.txtx") rese in 1 articolo restituito.

Secondo Microsoft, questo è il comportamento previsto (vedere la nota in MSDN).

Le mie domande sono:

  1. Perché Microsoft ha deciso di avere una funzionalità di così strano?

  2. Come posso risolvere questo problema?
    Ad esempio, come si dispone di un modello di ricerca che restituisce solo l'estensione *.txt e non restituisce *.txtx, *.txtstarngefunctionality, ecc.?

risposta

0

Sarei disposto a scommettere che si tratti di compatibilità con le versioni precedenti. Non vedo questo problema esatto menzionato, ma this Raymond Chen blogpost cita un certo numero di stranezze in questa area:

[...] alcune stranezze del algoritmo di matching FCB persistono in Win32 perché sono diventati idioma.

Ad esempio, se il modello termina con .*, lo .* viene ignorato. Senza questa regola, il modello *.* corrisponderebbe solo ai file che contenevano un punto, il che interromperebbe probabilmente il 90% di tutti i file batch sul pianeta, così come la memoria muscolare di tutti, dal a tutti coloro che eseguono Windows NT 3.1 è cresciuto in un mondo in cui *.* significava tutti i file.

Come un altro esempio, un motivo che termina in un punto non corrisponde effettivamente a file che terminano in un punto; corrisponde a file senza estensione. E un punto interrogativo può corrispondere a zero caratteri se viene immediatamente prima di un punto.

2

Il motivo è la compatibilità con le versioni precedenti.

Windows è stato inizialmente creato come interfaccia grafica su MSDOS con solo file con 8 caratteri per il nome e un massimo di 3 per l'estensione. Le estensioni ai file system MSDOS consentivano a Windows di avere nomi e estensioni di file più lunghi, ma questi sarebbero comunque visualizzati come nomi di file 8.3 in MSDOS.

Poiché il prompt dei comandi di Windows è un'evoluzione del vecchio interprete di comandi in MSDOS, ciò significa che alcuni comportamenti "anacronistici" (come il modello di ricerca a 3 lettere) sono stati mantenuti in modo tale che applicazioni e script creati nei "vecchi tempi" o da i "vecchi temporizzatori" non si rompono.

(un altro esempio è il fatto di file più finestre sistemi sono case insensitive, sì, avete indovinato, perché quello MSDOS non ha avuto involucro)

+0

(NTFS possono essere [minuscole] (http://support.microsoft.com/kb/100625)) –

1

Se si desidera una soluzione alternativa, si può semplicemente recuperare tutti i file percorsi

var files = Directory.GetFiles(@"C:\tmp123"); 

e poi filtrare per estensione, se necessario

var txtFiles = files.Where(f => f.EndsWith(".txt")); 
var txtxFiles = files.Where(f => f.EndsWith(".txtx")); 
0

Ecco un'altra soluzione che aiuterà con filtrando i file wi estensioni th come ".txtxt":

var Files = System.IO.Directory.GetFiles("*.txt").Where(item => item.Extension.ToString().ToLower() == ".txt");