【问题标题】:How to Remove Directories From EnumerateFiles?如何从 EnumerateFiles 中删除目录?
【发布时间】:2018-04-28 21:22:22
【问题描述】:

所以我正在开发一个列出目录中所有文件的程序。很简单。基本上,当我这样做时:List<string> dirs = new List<string>(Directory.EnumerateFiles(target));,我不希望它包含目录和所有内容。只是文件名。当我运行我的代码时;

    List<string> dirs = new List<string>(Directory.EnumerateFiles(target));
    Console.WriteLine($"Folders and files in this directory:\n");
    foreach (string i in dirs) {
        Console.WriteLine($"> {i}");
    }

它给了我以下信息:

C:\Users\Camden\Desktop\Programming\Visual Studio\C#\DirectoryManager\DirectoryManager\bin\Debug\DirectoryManager.exe

我只想要 DirectoryManager.exe 部分,所以我查了一下,发现可以替换字符串中的字符串。像这样:i.Replace(target, "");。然而,这并没有做任何事情,它只是像往常一样运行。为什么它不替换,我应该怎么做?

【问题讨论】:

  • 从‘\’的最后一个索引中取出一个子字符串
  • 我该怎么做?
  • 只要使用Path.GetFileName

标签: c# file directory enumerate


【解决方案1】:

使用 System.IO.Path 类中的方法。

        var fullfile = @"C:\Users\Camden\Desktop\Programming\Visual Studio\C#\DirectoryManager\DirectoryManager\bin\Debug\DirectoryManager.exe";
        var fileName = Path.GetFileName(fullfile); // DirectoryManager.exe
        var name = Path.GetFileNameWithoutExtension(fullfile);  // DirectoryManager

【讨论】:

    【解决方案2】:

    最简单的方法是使用 Select IEnumerable 扩展
    (你需要在源代码文件的顶部有一个using Linq;

    List<string> files = new List<string>(Directory.EnumerateFiles(target)
                                          .Select(x => Path.GetFileName(x)));
    

    通过这种方式,Directory.EnumerateFiles 检索到的文件序列一个接一个地传递给 Select 方法,其中每个完整文件名 (x) 都传递给 Path.GetFileName 以生成新的文件名序列。
    然后这个序列作为参数返回给 List 构造函数。

    关于您对 Replace 方法的问题。请记住,Replace 方法不会更改您用于调用该方法的字符串,而是返回一个执行替换的新字符串。在 NET 中,字符串是不可变的。

    所以如果你想看看你需要的替代品

    string justFileName = i.Replace(target, "");
    

    【讨论】:

      【解决方案3】:

      使用Directory.EnumerateFiles 的替代方法是DirectoryInfo.EnumerateFiles。此方法返回一个IEnumerable&lt;FileInfo&gt;。然后,您可以使用每个返回对象的 FileInfo.Name 属性。您的代码将变为:

      var files = new DirectoryInfo(target).EnumerateFiles(); 
      Console.WriteLine("Files in this directory:\n"); 
      foreach (FileInfo i in files) { 
          Console.WriteLine($"> {i.Name}"); 
      }
      

      仅用于文件名列表:

      List<string> fileNames = new DirectoryInfo(target).EnumerateFiles().Select(f => f.Name).ToList();
      

      或者,如果你想要两个文件目录,你可以使用EnumerateFileSystemInfos。如果您需要知道是否有文件和目录,可以查询 Attributes 属性并将其与 FileAttributes 标志枚举进行比较。

      var dirsAndFiles = new DirectoryInfo(target).EnumerateFileSystemInfos(); 
      Console.WriteLine("Folders and files in this directory:\n"); 
      foreach (var i in dirsAndFiles) { 
          var type = (i.Attributes & FileAttributes.Directory) == FileAttributes.Directory ? "Directory" : "File";
      
          Console.WriteLine($"{type} > {i.Name}"); 
      }
      

      FileSystemInfo.Name 属性将返回文件名(如果是文件)或层次结构中的最后一个目录(对于目录)——所以只是子目录名而不是完整路径(“sub”代替"c:\sub")。

      【讨论】:

      • 写在我的手机上,所以无法验证代码中的任何拼写错误
      猜你喜欢
      • 2012-05-11
      • 2019-04-06
      • 1970-01-01
      • 2018-12-28
      • 2015-01-20
      • 1970-01-01
      • 2019-10-03
      • 2013-01-17
      • 1970-01-01
      相关资源
      最近更新 更多