2009-04-24 17 views
7

Básicamente, tengo este código:¿Por qué DirectoryInfo.GetFiles() coincide con archivos que no coinciden con la máscara?

DirectoryInfo dir = new DirectoryInfo(@"\\MYNETWORK11\ABCDEFG\ABCDEFGHIJKL\00806\"); 
FileInfo[] files = dir.GetFiles("200810*"); 

espero que se han encontrado archivos a partir de 200810. Sin embargo, se ficheros llamados

20070618_00806.bak y 20070817_00806.bak juego (las estrellas aren 't en el nombre del archivo, esa era la única forma en que podía incluir el guión bajo)

Lo intenté con dir desde un símbolo del sistema, y ​​también coincide con esos archivos. ¿Por qué?

Editar:

Tal vez usando C: como el ejemplo no era una buena cosa. El directorio realidad estoy preguntando es un recurso compartido de red \\ MYNETWORK11 \ ABCDEFG \ ABCDEFGHIJKL \ 00806 \

Si la comprobación contra el nombre corto tiene nada que ver con esto, ¿no será 20070817_00806.bak 200708 ~ 1. bak? Que no coincide con cualquiera

+0

Esto no lo explica por completo, así que solo lo estoy agregando como comentario, pero _ es un carácter especial para fines de coincidencia. Pon un 2 en lugar del _ para esos nombres de archivo y te acercas un poco más. –

+0

@Joel, ¿estás diciendo que _ es especial en Windows o en el formato SO? – scottm

+0

Funciona para mí. Creé un archivo llamado 20070618_00806.bak y ejecuté 'dir 200810 *' en la carpeta. No se encontraron archivos. ¿Me estoy perdiendo de algo? –

Respuesta

14

msdn estados que

"Debido a que este método comprueba contra nombres de archivo tanto con el nombre de archivo 8.3 formato y el formato de nombre de archivo largo, un patrón de búsqueda similar a "*1*.txt" puede devolver los nombres de archivos inesperados. Por ejemplo, usando un patrón de búsqueda de "*1*.txt" devolverá "longfilename.txt" debido a que el formato de nombre de archivo 8.3 equivalente sería be "longf~1.txt". "

¿Podría ser esta la causa?

4

No puedo reproducir este, ya sea desde la línea de comandos o en una aplicación de prueba:

c:\Users\Jon\Test>echo > 20070618_00806.bak 

c:\Users\Jon\Test>echo > 2007081700806.bak 

c:\Users\Jon\Test>dir 200810* 
Volume in drive C is OS 
Volume Serial Number is B860-7E20 

Directory of c:\Users\Jon\Test 

File Not Found 

Y la aplicación de C#:

using System; 
using System.IO; 

class Test 
{ 
    static void Main() 
    { 
     foreach (var file in new DirectoryInfo(".").GetFiles("200810*")) 
     { 
      Console.WriteLine(file); 
     } 
    } 
} 

(Esto no tiene 't print any results.)

Quizás haya algún ajuste del sistema operativo en algún lugar que marque la diferencia ... ¿qué sistema operativo está utilizando? (Estoy en Vista de 32 bits.)

+0

@Jon Windows XP – scottm

+0

Mismo comportamiento para mí también. –

+0

Cuando ejecuto esta prueba localmente, funciona como se esperaba. Incluso probé en otra red compartida y funciona como se esperaba. – scottm

1

GetFiles buscará el nombre del archivo largo y el nombre de archivo corto ... de alguna manera no coincide con nombres de archivos cortos ¿verdad?

6

Pruebe esto desde la línea de comandos:

dir /x 200810* 

El "/ X" hacer que se muestre los nombres de archivo cortos, así como los nombres de archivo largos. Esto le permitiría ver si el nombre de archivo abreviado realmente comienza con "200810".

Cuestiones relacionadas