在 dotnet 里面,可以使用 Directory.EnumerateXXX 系列方法进行枚举文件或文件夹。在准备枚举驱动器根路径的文件或文件夹时,可能获取到错误的路径。错误的步骤在于传入的是如 C: 不带斜杠的路径,且存在同驱动器磁盘下的非根路径工作路径

特别感谢 神樹桜乃若凡 两位大佬,让我明白了此问题和原因

此问题已报告给 dotnet 官方,详细请看 https://github.com/dotnet/runtime/issues/82085

这是一个稍微复杂的问题,大部分情况下大家不会遇到。这是一个从 .NET Core 3.1 到 .NET 7 都存在的问题,且基本上和系统环境无关

在 dotnet 里面可以使用 Directory.EnumerateXXX 系列方法进行枚举文件或文件夹,比如 Directory.EnumerateFiles 和 Directory.EnumerateFileSystemEntries 等方法。在使用这些方法进行枚举驱动器的根路径,如 C: 盘的文件或文件夹时,如果传入的路径参数是不带斜杠的,如 C: 而不是 C:\ 时,如果同时此时的工作路径是同驱动器下的非根路径,如 C:\lindexi 文件夹时,将会枚举出错误的路径

以下是 神樹桜乃 大佬给出的最简复现步骤

先在 C 盘创建一个名为 bug 的文件夹,在此文件夹里面放入 a b c 三个文件

接着设置工作路径为 C:\bug 且运行以下代码

foreach (var item in Directory.EnumerateFiles("C:"))
{
Console.WriteLine(item);
}

此时的输出居然是如下代码

C:\a
C:\b
C:\c

也就是中间的 bug 文件夹没有输出,输出的是错误的路径。预期的输出应该如下

C:\bug\a
C:\bug\b
C:\bug\c

这个已知问题的核心原因是在 dotnet 底层里面调用的 GetFullPathNameW 函数行为和 dotnet 预期的不相同,如 官方文档 描述如下内容

If you specify "U:" the path returned is the current directory on the "U:" drive

也就是如果传入参数是 C: 不带斜杠的,将会使用传入的驱动器的当前工作路径。这也就导致了工作路径是同驱动器下的非根路径将会枚举到工作路径下的文件或文件夹,也就是上面例子里可以枚举到 a 和 b 和 c 文件的原因。只不过在 dotnet 的对外输出层拼接路径时,依然用的是传入的 C: 进行拼接,从而导致了输出错误

有一个可以用来实验的步骤是:先在 C 盘创建 lindexi 文件夹,打开 cmd 进入 C:\lindexi 文件夹,再使用 dotnet run 命令运行测试的项目,在测试的项目里面运行 Console.WriteLine(Path.GetFullPath("C:")); 这句代码。可以看到输出的是 C:\lindexi 文件夹,证明了 Windows 的底层行为符合文档

如何规避此问题?只需要破坏其条件即可,也就是在传入路径参数加上斜杠后缀,如 C:\ 路径,即可解决此问题

dotnet 已知问题 使用 Directory.EnumerateXXX 方法枚举 C 盘根路径可能错误的问题的更多相关文章

  1. javascript 解决默认取整的坑(目前已知的最佳解决方案)

    javascript 解决默认取整的坑(目前已知的最佳解决方案) 复现该问题 js在数字操作时总会取更高精度的结果,例如1234/10结果就是123.4,但是在c或者java中整数除以10的结果还是整 ...

  2. 假设高度已知,请写出三栏布局,其中左栏、右栏各为300px,中间自适应的五种方法

    假设高度已知,请写出三栏布局,其中左栏.右栏各为300px,中间自适应的五种方法 HTML CSS 页面布局 题目:假设高度已知,请写出三栏布局,其中左栏.右栏各为300px,中间自适应 <!D ...

  3. css多种方法实现已知宽度和未知宽度的元素水平垂直居中

    // html <div class="box-wrapper"> <div class="box"> 内部box <p>更 ...

  4. 小小知识点(四十七)——发送端已知CSI,基于注水算法的功率分配方法,实现功率受限下的信道容量最大化

    1. 注水算法的使用条件和推导 注水算法是根据某种准则,并根据信道状况对发送功率进行自适应分配,通常是信道状况好的时刻,多分配功率,信道差的时候,少分配功率,从而最大化传输速率.实现功率的“注水”分配 ...

  5. 项目文件中的已知 NuGet 属性(使用这些属性,创建 NuGet 包就可以不需要 nuspec 文件啦)

    知道了 csproj 文件中的一些常用 NuGet 属性,创建 NuGet 包时就可以充分发挥新 Sdk 自动生成 NuGet 包的优势,不需要 nuspec 文件啦.(毕竟 nuspec 文件没有 ...

  6. NO16 第二关课后考试-aw-F-过滤已知的一级目录

    ·总结的经验:1.学会总结时学好运维的重要前提.2.通过案列或例子来总结一个技术点或者命令.3.画一张逻辑图,形象的卡通记忆这个知识技术点.4.通过管道过滤数据时,最好先输出结果,然后回退再使用管道看 ...

  7. Delphi 查找标题已知的窗口句柄,遍历窗口控件句柄(转)

    用我的方法来控制其他程序窗体上的窗口控件,必须先了解什么是 回调函数.我的理解是这样的: 回 调函数写出来不是自己的程序去调用的,反而是让其他的东西去调用,比如windows操作系统,比如其他的程序等 ...

  8. Java集合-5. (List)已知有一个Worker 类如下: 完成下面的要求 1) 创建一个List,在List 中增加三个工人,基本信息如下: 姓名 年龄 工资 zhang3 18 3000 li4 25 3500 wang5 22 3200 2) 在li4 之前插入一个工人,信息为:姓名:zhao6,年龄:24,工资3300 3) 删除wang5 的信息 4) 利用for 循

    第六题 5. (List)已知有一个Worker 类如下: public class Worker { private int age; private String name; private do ...

  9. WCF 已知类型和泛型解析程序 KnownType

    数据协定继承 已知类型和泛型解析程序 Juval Lowy 下载代码示例 自首次发布以来,Windows Communication Foundation (WCF) 开发人员便必须处理数据协定继承方 ...

  10. 【编程题目】n 支队伍比赛,分别编号为 0,1,2。。。。n-1,已知它们之间的实力对比关系,

    36.引用自网友:longzuo(运算)谷歌笔试: 19n 支队伍比赛,分别编号为 0,1,2....n-1,已知它们之间的实力对比关系,存储在一个二维数组 w[n][n]中,w[i][j] 的值代表 ...

随机推荐

  1. Retrofit源码分析

    目录介绍 1.首先回顾Retrofit简单使用方法 2.Retrofit的创建流程源码分析 2.1 Retrofit对象调用Builder()源码解析 2.2 Retrofit对象调用baseUrl( ...

  2. 三维模型3DTile格式轻量化云端处理技术方法分析

    三维模型3DTile格式轻量化云端处理技术方法分析 在现代的地理信息系统 (GIS) 中,3D Tiles 是一种很重要的数据格式,用于存储和传输大规模地理空间数据.然而,由于其数据密度高,传输和加载 ...

  3. 三维模型OBJ格式轻量化顶点压缩主要技术方法分析

    三维模型OBJ格式轻量化顶点压缩主要技术方法分析 三维模型的OBJ格式轻量化中,顶点压缩是一项重要的技术方法,用于减小模型文件的大小.以下是关于三维模型OBJ格式轻量化顶点压缩的主要技术方法的分析: ...

  4. Redis数据库安装与使用总结

    Redis语句总结 一.基本概念 Redis 全称: Remote Dictionary Server(远程字典服务器)的缩写,以字典结构存储数据,并允许其他应用通过TCP协议读写字典中的内容. 使用 ...

  5. 利用kali自带的msfvenom工具生成远程控制软件

    一.首先还是得打开postgresql service postgresql start 然后让我们看看它有哪些功能 部分参数 -p 选择一个载荷,或者说一个模块吧. -i 载荷列表 -f 生成的文件 ...

  6. C#中字典集合的两种遍历

    记录一下 Dictionary<string, string> dictionary = new Dictionary<string,string>(); foreach (s ...

  7. read IEEE standard for verilog(3)

    read IEEE std for verilog 1.阅读准备 在阅读的第二部分读到了lexical conventions,这次计划读一节.也就是把lexical conventions读完. 2 ...

  8. #随机#CF1198F GCD Groups 2

    题目 将 \(n\) 个数分为两组,使得两组的GCD都为1,求具体的分组情况 分析 考虑直接打乱 \(n\) 个数,如果能使第一组GCD减小就减小,否则丢到第二组, 由于打乱后出错的概率会减小,所以r ...

  9. Pandas对象(数据结构)

    Pandas是Python的一个扩展程序库,是在Numpy基础上建立的,提供高性能.易使用的数据结构和数据分析工具. Pandas 可以从各种文件格式比如 CSV.JSON.SQL.Excel 等中导 ...

  10. 鸿蒙手表定位功能Demo体验,适用儿童、老年和外出旅游安全市场

    针对儿童和老人,可穿戴的智能手表用处很大.市场也有许多类似的产品,支持接打电话.支付扫码.定位等功能,属于新兴的商业机会.依托华为品牌,鸿蒙手表也致力为用户打造精品的.产品质量佳.可穿戴的智能体验.对 ...