如何从EnumerateFiles中删除目录?

时间:2018-04-28 21:22:22

标签: c# file directory enumerate

所以我正在开发一个列出目录中所有文件的程序。很简单。基本上,当我这样做时: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, "");。但是,这没有做任何事情,它只是正常运行。为什么不替换它,我应该怎么做呢?

3 个答案:

答案 0 :(得分:2)

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

{{1}}

答案 1 :(得分:1)

最简单的方法是使用Select IEnumerable extension (您需要在源代码文件的顶部有一个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, "");

答案 2 :(得分:0)

使用Directory.EnumerateFiles的替代方法是DirectoryInfo.EnumerateFiles。此方法返回IEnumerable<FileInfo>。然后,您可以使用每个返回对象的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“)。