Jak uzyskać tylko nazwy plików w katalogu przy użyciu języka C #?

80

Kiedy używam linii kodu, jak poniżej, otrzymuję tablicę ciągów zawierającą całą ścieżkę poszczególnych plików.

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

Chciałbym wiedzieć, czy istnieje sposób na pobranie tylko nazw plików w ciągach, a nie całych ścieżek.

HelloWorld_Always
źródło

Odpowiedzi:

160

Możesz użyć, Path.GetFileNameaby pobrać nazwę pliku z pełnej ścieżki

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

EDYCJA: powyższe rozwiązanie używa LINQ , więc wymaga co najmniej .NET 3.5. Oto rozwiązanie, które działa we wcześniejszych wersjach:

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
źródło
Cześć Thomas, pojawia się błąd taki jak ten „System.Array” nie zawiera definicji dla „Select” i nie można znaleźć metody rozszerzenia „Select” akceptującej pierwszy argument typu „System.Array” (czy brakuje dyrektywy lub odwołania do zestawu?) Czy jest jeszcze coś, co muszę wziąć pod uwagę?
HelloWorld_Always
Dodaj using System.Linq;na początku pliku i odwołanie do System.Corezestawu, jeśli jeszcze go tam nie ma. Wymaga .NET 3.5 lub nowszego, opublikuję rozwiązanie dla .NET 2.0, jeśli będzie potrzebne
Thomas Levesque,
9

Możesz użyć metody Path.GetFileName(yourFileName); (MSDN), aby po prostu uzyskać nazwę pliku.

Abbas
źródło
Pytanie dotyczy zbioru elementów, a nie traktowania pojedynczych ciągów znaków.
Tigran
7

Możesz użyć klas DirectoryInfo i 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
źródło
2
string[] fileEntries = Directory.GetFiles(directoryPath);

foreach (var file_name in fileEntries){
    string fileName = file_name.Substring(directoryPath.Length + 1);
    Console.WriteLine(fileName);
}
himanshu
źródło
3
Czy możesz wyjaśnić swoją odpowiedź? Czy możesz wyjaśnić, w jaki sposób Twoje rozwiązanie zasadniczo różni się od odpowiedzi Thomasa Levesque'a udzielonej przez 8 lat? A w szczególności, czy możesz wyjaśnić, dlaczego używasz, Substringzamiast korzystać z Pathfunkcji, która zrobi to samo, w potencjalnie bardziej niezawodny sposób?
Wyck
1

Jest tak wiele sposobów :)

1. sposób:

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

Drugi sposób:

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

3 sposób:

string[] folders = 
    new DirectoryInfo(yourPath).GetDirectories().Select(delegate(DirectoryInfo di)
    {
        return di.Name;
    }).ToArray();
Mshini
źródło
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
źródło
0

Możesz po prostu użyć linq

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

Uwaga: EnumeratesFiles jest bardziej wydajne w porównaniu z Directory.GetFiles, ponieważ możesz rozpocząć wyliczanie kolekcji nazw przed zwróceniem całej kolekcji.

jeevjyot singh chhabda
źródło