是否有类似Directory.EnumerateFiles的方法直接返回相对路径而非绝对路径?
高效获取文件相对路径的方案
针对你需要从当前目录获取所有文件的相对路径、避免大量字符串分配的需求,以下两种方案可以解决问题:
方案一:使用框架原生的Path.GetRelativePath方法
.NET Core 2.0+、.NET Framework 4.6.2+ 提供了Path.GetRelativePath,它能直接将绝对路径转换为相对于基准目录的相对路径,内部实现经过优化,比手动截取字符串更高效且更可靠(自动处理目录分隔符、上级目录等边界情况)。
代码示例:
var baseDirectory = Directory.GetCurrentDirectory(); var relativeFilePaths = Directory.EnumerateFiles(baseDirectory, "*", SearchOption.AllDirectories) .Select(absPath => Path.GetRelativePath(baseDirectory, absPath));
方案二:递归遍历直接构建相对路径
如果想完全跳过绝对路径的生成环节,可手动递归遍历目录,在遍历过程中直接拼接相对路径,减少字符串转换的开销:
IEnumerable<string> EnumerateRelativeFiles(string rootDir, string currentRelativePath = "") { // 枚举当前目录下的文件,直接生成相对路径 foreach (var file in Directory.EnumerateFiles(Path.Combine(rootDir, currentRelativePath))) { yield return Path.Combine(currentRelativePath, Path.GetFileName(file)); } // 递归枚举子目录 foreach (var subDir in Directory.EnumerateDirectories(Path.Combine(rootDir, currentRelativePath))) { var subDirRelativePath = Path.Combine(currentRelativePath, Path.GetFileName(subDir)); foreach (var file in EnumerateRelativeFiles(rootDir, subDirRelativePath)) { yield return file; } } } // 使用方式 var allRelativeFiles = EnumerateRelativeFiles(Directory.GetCurrentDirectory());
这个方法使用迭代器(yield return),无需一次性加载所有文件路径到内存,适合处理超大量文件的场景,同时全程避免了绝对路径到相对路径的转换操作。
注意事项
- 使用
Path.GetRelativePath时,如果目标文件和基准目录不在同一卷,方法会返回绝对路径,需确保所有文件都在当前目录所在卷内。 - 递归遍历需处理目录权限问题,可根据需求添加异常捕获逻辑。
内容的提问来源于stack exchange,提问作者KTSnowy
相关产品推荐
相关产品推荐

