获取文件夹内的文件/子文件夹 时,输出了错误的路径

BUG反馈 · 102 次浏览
白云朔 创建于 7天16小时前

如果直接获取D:而不是D:\(即D盘根目录的文件),且没有带\时,输出的路径也会是没有带\的。

并且将根目录不带\的路径输入【文件和目录操作】(获取文件夹内的子文件夹)时,仍然能正确输出(就很离谱):

可以看到没带\也正常输出了

 

但在输入至【文件和目录操作】(复制到指定目录下(Windows))的目标路径时,又会出现异常(错误的报错)

白云朔 最后更新于 2025/9/4

回复内容
CL 7天8小时前
#1

确实,这个看起来是底层的实现方式。暂不确定自动追加\是否会有副作用,先把目录都手动加上\吧。


CL 最后更新于 7天8小时前
白云朔 回复 CL 7天6小时前 :

手动加上\是正常的,但是通过cmd命令获得的盘符列表默认就是不带\的。

如果是希望实现如下操作:获取电脑中的所有盘符(通过cmd)→获取盘符中的文件列表(通过【文件和目录操作】)→移动文件至文件夹(通过【文件和目录操作】)

对于没中招过此BUG的开发者而言,几乎是必然中招的。

也许可以在【文件和目录操作】(获取文件/文件夹)对于输入路径加上一个预处理步骤,检查一下输入路径末尾是否有\,如果没有,就在末尾添加\。(理论上无论是否是根目录,输入路径末尾有没有\,对输出路径都不会产生负面影响)

但是这里还有一些其他问题:

1.如果是获取的网络路径,直接添加\是否也会导致错误

(个人怀疑这是否就是因为输入路径本身没有带\或/,导致输出路径也不知道带啥了,所以就没有分隔符输出)


白云朔 最后更新于 7天6小时前
白云朔 回复 CL 7天0小时前 :

我个人已在自己的动作中自行补足末尾的\了,但是还是建议C大可能麻烦一下,在模块内部处理一下此情况会更好些。

因为如果【文件和目录操作】(获取文件/文件夹)的输入路径,为动作的 用户自行输入的任意路径 时,大部分普通路径都能正常工作,而一旦用户直接输入根目录盘符且没有带\,则可能导致错误。

大部分其他动作的开发者应该都是没有手动写逻辑来排除此情况的,并且此情况出现时也不会被模块进行报错并抛出,在用户和开发者都未察觉的情况下,有可能会基于此路径错误的问题导致一些严重的错误。而【文件和目录操作】(获取文件/文件夹)此模块又是一个比较高频使用且基础的模块,所以此问题可能直接在模块内补上,或者报错抛出会更好些?
如果您认为此问题还是动作开发者自行解决更好,那么我这边可能得排查一下我所有涉及此模块的部分了(悲

白云朔 最后更新于 7天0小时前
CL 回复 白云朔 6天10小时前 :

好的,我先研究下为什么会这样,有没有什么深意...

白云朔 回复 CL 6天10小时前 :

好的,麻烦C大了🌹🌹🌹🌹

CL 回复 白云朔 6天9小时前 :

经过测试,验证了AI的说法,在没有斜杠的时候,获得的不一定是根目录里的文件列表,而是这个分区“当前目录”的文件列表。看起来自动补个斜杠应该是合适的。

--------

在 C# 里,Directory.GetFiles("c:")Directory.GetFiles("c:\\") 的行为确实不一样,这跟 Windows 对路径的解释 有关,而不是 C# 本身的特性。区别主要在于:


1. c:\绝对路径

  • c:\ 明确表示 C 盘根目录

  • 所以 Directory.GetFiles("c:\\") 会列出 C 盘根目录下的所有文件


2. c:当前工作目录的盘符路径

  • 仅写 c: 时,Windows 会解释成 C 盘上当前的工作目录,而不是根目录。

  • 每个驱动器都有自己“记住的”当前工作目录。比如:

    C:\Users> cd C:\Windows
    C:\Users> C:
    C:\Windows>  ← 这里就是 C: 的当前目录
    
  • 所以 Directory.GetFiles("c:") 实际上等价于:

    Directory.GetFiles(Path.Combine(Environment.CurrentDirectoryOnC, "."));
    

    这会依赖 C 盘上上次访问时的“当前目录”。如果程序启动时没显式切换,可能默认是 C:\Windows\System32 或者其他位置。


3. 实际效果

  • Directory.GetFiles("c:\\") → 始终列出 C 盘根目录

  • Directory.GetFiles("c:") → 列出 C 盘当前目录,可能是某个子目录,而不是根目录。


4. 解决方法

如果你想始终获取根目录下的文件,应该始终使用 带反斜杠的绝对路径

var files = Directory.GetFiles(@"C:\");

如果你想获取某个特定子目录:

var files = Directory.GetFiles(@"C:\Windows");


白云朔 回复 CL 6天9小时前 :

但根据模块的输出结果来看,其输出也不是类似于C:\Windows这样的工作目录,而是C:desktop.ini这样的不带分隔符的文件路径,这似乎也不太符合其输出工作目录的描述。不过总之,在不带\这样的情况下,输出的结果是偏离预期(或普遍认知)的,这一点是可以证实的。

但是自动在输入路径的尾部添加\是否会影响网络路径中文件/文件夹的获取呢(毕竟网络路径使用的是/而不是\)?不知道本模块是否对网络路径也有支持,如果有的话,这似乎也仍然可能会导致一些符号错误的问题。

白云朔 最后更新于 6天9小时前
CL 回复 白云朔 6天3小时前 :

好的,我自动加一个\。

回复主贴