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

84

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

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

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

7个回答

171
你可以使用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;
}

嗨,Thomas,我遇到了这样的错误:“System.Array”不包含“Select”的定义,也没有接受类型为“System.Array”的第一个参数的扩展方法“Select”(是否缺少使用指令或程序集引用?)。我需要考虑其他什么吗? - HelloWorld_Always
1
在文件开头添加 using System.Linq;,如果还未引用 System.Core 程序集,则需要添加引用。此代码需要 .NET 3.5 或更高版本,如果需要使用 .NET 2.0,我会发布一个解决方案。 - Thomas Levesque
我的目标是wince7,所以对于早于.NET 3.5的解决方案非常有用。 - drlolly

9
你可以使用方法Path.GetFileName(yourFileName);(MSDN)来获取文件名。该方法只返回文件名,使其更易于理解。请注意保留HTML标记。

这个问题涉及到一组项目的处理,而不是单个字符串值的处理。 - Tigran

8
您可以使用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

1

有很多种方法 :)

第一种方法:

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

1
您可以简单地使用linq。
Directory.EnumerateFiles(LoanFolder).Select(file => Path.GetFileName(file));

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接