【问题标题】:How to get only filenames within a directory using c#?如何使用 c# 仅获取目录中的文件名?
【发布时间】:2011-10-31 16:33:41
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    您可以使用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”的定义,并且没有扩展方法“Select”接受“System.Array”类型的第一个参数找到(您是否缺少 using 指令或程序集引用?)还有什么我需要考虑的吗?
    • 在文件开头添加using System.Linq;,如果还没有System.Core 程序集,则添加一个引用。它需要 .NET 3.5 或更高版本,如果您需要,我会发布 .NET 2.0 的解决方案
    【解决方案2】:

    你可以使用Path.GetFileName(yourFileName);(MSDN)的方法来获取文件名。

    【讨论】:

    • 问题是关于项目的集合,而不是单个字符串值的处理。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:
      string[] fileEntries = Directory.GetFiles(directoryPath);
      
      foreach (var file_name in fileEntries){
          string fileName = file_name.Substring(directoryPath.Length + 1);
          Console.WriteLine(fileName);
      }
      

      【讨论】:

      • 你能解释一下你的答案吗?您能否解释一下您的解决方案与 Thomas Levesque 长达 8 年的答案有何显着不同?而且,特别是,您能解释一下为什么您使用Substring 而不是使用Path 函数,它会以一种可能更强大的方式做同样的事情吗?
      【解决方案5】:

      有很多方法:)

      第一种方式:

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

      【讨论】:

        【解决方案6】:

        你可以简单地使用 linq

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

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

        【讨论】:

          【解决方案7】:
          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();
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-09-22
            • 1970-01-01
            • 2012-01-02
            • 2015-09-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多