Як отримати лише імена файлів у каталозі за допомогою c #?


80

Коли я використовую рядок коду, як показано нижче, я отримую масив рядків, що містить весь шлях до окремих файлів.

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

Я хотів би знати, чи є спосіб отримати лише імена файлів у рядках, а не цілі шляхи.

Відповіді:


160

Ви можете використовувати, Path.GetFileNameщоб отримати ім'я файлу з повного шляху

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

EDIT: у наведеному вище рішення використовується LINQ , тому для нього потрібен принаймні .NET 3.5. Ось рішення, яке працює на попередніх версіях:

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;
}

Привіт Томасе, я отримую помилку, подібну до цієї 'System.Array' не містить визначення для 'Select', і не може бути знайдено жодного методу розширення 'Select', що приймає перший аргумент типу 'System.Array' (вам не вистачає директива чи посилання на збірку?) Чи є ще щось, що мені потрібно врахувати?
HelloWorld_Always

Додайте using System.Linq;на початку файлу та посилання на System.Coreзбірку, якщо вона ще не там. Для цього потрібен .NET 3.5 або вище, я опублікую рішення для .NET 2.0, якщо вам це потрібно
Thomas Levesque

9

Ви можете використовувати метод Path.GetFileName(yourFileName); (MSDN), щоб просто отримати ім'я файлу.


Питання полягає в колекції предметів, а не в одній обробці значення рядка.
Тігран

7

Ви можете використовувати класи DirectoryInfo та 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
Чи можете ви пояснити свою відповідь? Чи можете ви пояснити, чим ваше рішення суттєво відрізняється від 8-річної відповіді Томаса Левеска? І, зокрема, чи можете ви пояснити, чому ви використовуєте, Substringа не використовуєте Pathфункцію, яка буде робити те саме, потенційно більш надійним способом?
Вік,

1

Є так багато способів :)

1-й шлях:

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

2-й спосіб:

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

3-й шлях:

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

Ви можете просто використовувати linq

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

Примітка: EnumeratesFiles є більш ефективним порівняно з Directory.GetFiles, оскільки ви можете почати перераховувати колекцію імен до того, як буде повернута вся колекція.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.