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