¿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.

HolaMundo_Siempre
fuente

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;
}
Thomas Levesque
fuente
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.

Abbas
fuente
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;
Jesper Palm
fuente
2
string[] fileEntries = Directory.GetFiles(directoryPath);

foreach (var file_name in fileEntries){
    string fileName = file_name.Substring(directoryPath.Length + 1);
    Console.WriteLine(fileName);
}
himanshu
fuente
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();
Mshini
fuente
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();
        }
    }
}
Mayur Narula
fuente
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.

jeevjyot singh chhabda
fuente