2009-04-16 9 views
33

¿Cómo excluir cierto tipo de archivo al obtener archivos de un directorio?Excluir ciertas extensiones de archivos al obtener archivos de un directorio

me trataron

var files = Directory.GetFiles(jobDir); 

pero parece que esta función sólo puede elegir los tipos de archivos que desea incluir, no excluir.

+0

duplicado de éste: http://stackoverflow.com/questions/163162/can-you-call-directory-getfiles-with-multiple-filters –

+3

No, no exactamente una víctima. – Graviton

+0

Posible duplicado de [C# - Obtenga una lista de archivos con exclusión de los que están ocultos] (http://stackoverflow.com/questions/2418270/c-sharp-get-a-list-of-files-exclusing-those- that -are-hidden) – TarmoPikaro

Respuesta

70

Debe filtrar estos archivos por sí mismo, se puede escribir algo como esto:

var files = Directory.GetFiles(jobDir).Where(name => !name.EndsWith(".xml")); 
+0

Hasta ahora, el EndsWith toma en mayúsculas en cuenta, lo que significa que si el tipo de archivo fuera .XML no lo excluiría. –

+3

'var files = Directory.GetFiles (jobDir) .Where (name =>! Name.EndsWith (". Xml ", true));' –

+1

'var files = Directory.GetFiles (jobDir) .Where (name =>! name.EndsWith (".xml", StringComparison.OrdinalIgnoreCase)); ' – nothingisnecessary

0

Afaik no hay forma de especificar los patrones de exclusión. Tienes que hacerlo de forma manual, como:

string[] files = Directory.GetFiles(myDir); 
foreach(string fileName in files) 
{ 
    DoSomething(fileName); 
} 
+2

Gracias, pero hacerlo manualmente es algo que realmente no me gusta – Graviton

+0

Tal vez pueda derivar su propia clase de directorio desde el System.IO.Directory base si es posible (no lo he intentado). – Biri

9

Creo que se puede utilizar la expresión lambda

var files = Array.FindAll(Directory.GetFiles(jobDir), x => !x.EndWith(".myext")) 
+0

Buena respuesta, esto funciona para mí –

11

Puede intentar algo como esto:

var allFiles = Directory.GetFiles(@"C:\Path\", ""); 
    var filesToExclude = Directory.GetFiles(@"C:\Path\", "*.txt"); 
    var wantedFiles = allFiles.Except(filesToExclude); 
+0

Esto funciona brillantemente en todas las formas del comando GetFiles(). No resuelve la cuestión con precisión, pero se obtiene el beneficio adicional de aprovechar el parámetro searchPattern, que es mucho más poderoso que simplemente mirar las extensiones. –

+2

Asesoramiento: esto no funcionará con el método de instancia 'DirectoryInfo.GetFiles()': devuelve una matriz de FileInfo (en su lugar, cadena), una clase no comparable/no equitativa. –

-4
string[] filesToDelete = Directory.GetFiles(@"C:\Temp", "*.der"); 

foreach (string fileName in filesToDelete) 
{ 
    File.Delete(fileName); 
} 
+4

Claramente no leyó la pregunta. -1 –

+3

esta es la solución, pero muy radical – miky

+1

lol. No hay forma, por favor – Justin

0

Esta es mi versión de las respuestas que he leído por encima de

List<FileInfo> fileInfoList = ((DirectoryInfo)new DirectoryInfo(myPath)).GetFiles(fileNameOnly + "*").Where(x => !x.Name.EndsWith(".pdf")).ToList<FileInfo>(); 
6

que sé, esta solicitud de edad, pero por mí que siempre es importante.

si quieres exlude una lista de extensión de archivo (basado en https://stackoverflow.com/a/19961761/1970301)

var exts = new[] { ".mp3", ".jpg" }; 



public IEnumerable<string> FilterFiles(string path, params string[] exts) { 
    return 
     Directory 
     .GetFiles(path, SearchOption.AllDirectories) 
     .Where(file => !exts.Any(x => file.Extension.EndsWith(x, StringComparison.OrdinalIgnoreCase))); 
} 
3

Puede probar esto,

var directoryInfo = new DirectoryInfo("C:\YourPath"); 
var filesInfo = directoryInfo.GetFiles().Where(x => x.Extension != ".pdb"); 
0

me encontré con esta buscando un método para hacer aquí donde la exclusión podría usar las reglas de patrón de búsqueda y no solo la lógica de tipo EndWith.

p. Ej. Buscar coincidencias de especificador de comodín de patrón:

  • * (asterisco) Cero o más caracteres en esa posición.
  • ? (signo de interrogación) Cero o un personaje en esa posición.

Esto podría usarse para lo anterior de la siguiente manera.

string dir = @"C:\Temp"; 
var items = Directory.GetFiles(dir, "*.*").Except(Directory.GetFiles(dir, "*.xml")); 

O para excluir elementos que de lo contrario se incluirían.

string dir = @"C:\Temp"; 
var items = Directory.GetFiles(dir, "*.txt").Except(Directory.GetFiles(dir, "*HOLD*.txt")); 
Cuestiones relacionadas