You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否有类似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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 18:32:44