¿Cómo obtener solo nombres de archivo dentro de un directorio usando c #?


80

Cuando utilizo la línea de código que se muestra a continuación, obtengo una matriz de cadenas que contiene la ruta completa de los archivos individuales.

private string[] pdfFiles = Directory.GetFiles("C:\\Documents", "*.pdf");

Me gustaría saber si hay una manera de recuperar solo los nombres de los archivos en las cadenas en lugar de las rutas completas.

Respuestas:


160

Puede usar Path.GetFileNamepara obtener el nombre de archivo de la ruta completa

private string[] pdfFiles = Directory.GetFiles("C:\\Documents", "*.pdf")
                                     .Select(Path.GetFileName)
                                     .ToArray();

EDITAR: la solución anterior usa LINQ , por lo que requiere .NET 3.5 al menos. Aquí hay una solución que funciona en versiones anteriores:

private string[] pdfFiles = GetFileNames("C:\\Documents", "*.pdf");

private static string[] GetFileNames(string path, string filter)
{
    string[] files = Directory.GetFiles(path, filter);
    for(int i = 0; i < files.Length; i++)
        files[i] = Path.GetFileName(files[i]);
    return files;
}

Hola Thomas, aparece un error como este 'System.Array' no contiene una definición para 'Select' y no se puede encontrar un método de extensión 'Select' aceptando un primer argumento de tipo 'System.Array' (¿le falta un uso directiva o una referencia de ensamblado?) ¿Hay algo más que deba considerar?
— HelloWorld_Always

Agregue using System.Linq;al principio del archivo y una referencia al System.Coreensamblaje si aún no está allí. Requiere .NET 3.5 o superior, publicaré una solución para .NET 2.0 si la necesita
— Thomas Levesque

9

Puede utilizar el método Path.GetFileName(yourFileName); (MSDN) para obtener simplemente el nombre del archivo.


La pregunta es sobre una colección de elementos, no sobre un tratamiento de valor de una sola cadena.
— Tigran

7

Puede utilizar las clases DirectoryInfo y FileInfo.

//GetFiles on DirectoryInfo returns a FileInfo object.
var pdfFiles = new DirectoryInfo("C:\\Documents").GetFiles("*.pdf");

//FileInfo has a Name property that only contains the filename part.
var firstPdfFilename = pdfFiles[0].Name;

2
string[] fileEntries = Directory.GetFiles(directoryPath);

foreach (var file_name in fileEntries){
    string fileName = file_name.Substring(directoryPath.Length + 1);
    Console.WriteLine(fileName);
}

3
¿Puede dar una explicación de su respuesta? ¿Puede explicar cómo su solución es sustancialmente diferente de la respuesta de 8 años de Thomas Levesque? Y, en particular, ¿puede explicar por qué usa en Substringlugar de hacer uso de la Pathfunción que hará lo mismo, de una manera potencialmente más robusta?
— Wyck

1

Hay tantas formas :)

1er camino:

string[] folders = Directory.GetDirectories(path, "*", SearchOption.TopDirectoryOnly);
string jsonString = JsonConvert.SerializeObject(folders);

2do camino:

string[] folders = new DirectoryInfo(yourPath).GetDirectories().Select(d => d.Name).ToArray();

3er camino:

string[] folders = 
    new DirectoryInfo(yourPath).GetDirectories().Select(delegate(DirectoryInfo di)
    {
        return di.Name;
    }).ToArray();

0
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GetNameOfFiles
{
    public class Program
    {
        static void Main(string[] args)
        {
           string[] fileArray = Directory.GetFiles(@"YOUR PATH");
           for (int i = 0; i < fileArray.Length; i++)
           {

               Console.WriteLine(fileArray[i]);
           }
            Console.ReadLine();
        }
    }
}

0

Simplemente puede usar linq

Directory.EnumerateFiles(LoanFolder).Select(file => Path.GetFileName(file));

Nota: EnumeratesFiles es más eficiente en comparación con Directory.GetFiles, ya que puede comenzar a enumerar la colección de nombres antes de que se devuelva la colección completa.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.