如何使用C#仅获取目录中的文件名?


80

当我使用下面的代码行时,我得到一个字符串数组,其中包含各个文件的完整路径。

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

我想知道是否有一种方法只能检索字符串中的文件名,而不是整个路径。

Answers:


160

您可以用来Path.GetFileName从完整路径获取文件名

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

编辑:上面的解决方案使用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)来获取文件名。


问题是关于项目的集合,而不是单字符串值处理。
提格伦

6

您可以使用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
您能提供答案的解释吗?您能解释一下您的解决方案与Thomas Levesque的8年答案有何实质不同吗?特别是,您能否解释一下为什么以一种可能更强大的方式使用Substring而不是使用Path将执行相同操作的功能?
Wyck

0

有很多方法:)

第一种方式:

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

第二种方式:

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

第三种方式:

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

注意:与Directory.GetFiles相比,EnumeratesFiles效率更高,因为您可以在返回整个集合之前开始枚举名称集合。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.