使用Directory.EnumerateFiles方法如何选取第i个文件?
解决EnumerateFiles无法通过索引获取第i个文件的问题
Directory.EnumerateFiles返回的是IEnumerable<string>类型,这是一个延迟枚举的序列而非集合类型,因此无法直接通过[索引]的方式访问元素。要获取第i个文件,可通过以下两种方式实现:
方法1:使用LINQ的ElementAt方法
这种方式无需加载所有文件路径到内存,仅枚举到目标位置就停止,性能更高效:
using System.Linq; // 需引入LINQ命名空间 var txtFiles = Directory.EnumerateFiles(sourceDirectory, "*.txt"); // 获取第2个文件(索引从0开始,对应索引1) string secondFile = txtFiles.ElementAt(1); // 执行移动操作 string fileName = secondFile.Substring(sourceDirectory.Length + 1); Directory.Move(secondFile, Path.Combine(archiveDirectory, fileName));
如果不确定序列中是否存在足够数量的文件,可改用ElementAtOrDefault,不存在时返回null:
string secondFile = txtFiles.ElementAtOrDefault(1); if (secondFile != null) { // 执行操作 }
方法2:转换为List/数组后使用索引
若需要多次访问不同索引的文件,可先将序列转换为List<string>或数组,后续直接通过索引访问:
var txtFiles = Directory.EnumerateFiles(sourceDirectory, "*.txt").ToList(); // 或转换为数组:var txtFiles = Directory.EnumerateFiles(...).ToArray(); // 先判断是否存在第2个文件,避免索引越界 if (txtFiles.Count > 1) { string secondFile = txtFiles[1]; string fileName = secondFile.Substring(sourceDirectory.Length + 1); Directory.Move(secondFile, Path.Combine(archiveDirectory, fileName)); }
注意事项
- 索引从0开始,第N个文件对应索引
N-1; - 转换为List/数组会一次性加载所有文件路径到内存,若目标目录文件数量极大,可能造成内存占用过高,此时优先选择
ElementAt方法。
内容的提问来源于stack exchange,提问作者vuict
相关产品推荐
相关产品推荐

