Wie bekomme ich mit c # nur Dateinamen in einem Verzeichnis?

80

Wenn ich die folgende Codezeile verwende, erhalte ich ein String-Array, das den gesamten Pfad der einzelnen Dateien enthält.

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

Ich würde gerne wissen, ob es eine Möglichkeit gibt, nur die Dateinamen in den Zeichenfolgen und nicht die gesamten Pfade abzurufen.

HelloWorld_Always
quelle

Antworten:

160

Sie können verwenden Path.GetFileName, um den Dateinamen aus dem vollständigen Pfad abzurufen

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

BEARBEITEN: Die obige Lösung verwendet LINQ , daher ist mindestens .NET 3.5 erforderlich. Hier ist eine Lösung, die auf früheren Versionen funktioniert:

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
quelle
Hallo Thomas, ich erhalte eine Fehlermeldung wie diese. 'System.Array' enthält keine Definition für 'Select' und es konnte keine Erweiterungsmethode 'Select' gefunden werden, die ein erstes Argument vom Typ 'System.Array' akzeptiert (fehlt eine Verwendung?) Richtlinie oder eine Versammlungsreferenz?) Gibt es noch etwas, das ich berücksichtigen muss?
HelloWorld_Always
Fügen Sie using System.Linq;am Anfang der Datei einen Verweis auf die System.CoreAssembly hinzu, falls diese noch nicht vorhanden ist. Es erfordert .NET 3.5 oder höher, ich werde eine Lösung für .NET 2.0 veröffentlichen, wenn Sie es brauchen
Thomas Levesque
9

Sie können die Methode Path.GetFileName(yourFileName); (MSDN) verwenden, um nur den Namen der Datei abzurufen.

Abbas
quelle
Die Frage bezieht sich auf eine Sammlung von Elementen, nicht auf die Behandlung einzelner Zeichenfolgenwerte.
Tigran
6

Sie können die Klassen DirectoryInfo und FileInfo verwenden.

//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
quelle
2
string[] fileEntries = Directory.GetFiles(directoryPath);

foreach (var file_name in fileEntries){
    string fileName = file_name.Substring(directoryPath.Length + 1);
    Console.WriteLine(fileName);
}
Himanshu
quelle
3
Können Sie Ihre Antwort erklären? Können Sie erklären, wie sich Ihre Lösung wesentlich von der 8-jährigen Antwort von Thomas Levesque unterscheidet? Und können Sie insbesondere erklären, warum Sie Substringdie PathFunktion, die dasselbe tut, auf potenziell robustere Weise verwenden, anstatt sie zu nutzen ?
Wyck
0

Es gibt so viele Möglichkeiten :)

1. Weg:

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

2. Weg:

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

3. Weg:

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

Sie können einfach linq verwenden

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

Hinweis: EnumeratesFiles ist im Vergleich zu Directory.GetFiles effizienter, da Sie mit der Aufzählung der Namenssammlung beginnen können, bevor die gesamte Sammlung zurückgegeben wird.

jeevjyot singh chhabda
quelle