【问题标题】:GetFiles: Wrong resultGetFiles:错误的结果
【发布时间】:2011-06-24 05:18:40
【问题描述】:

我在递归调用中使用以下代码:

var files = di.GetFiles("*.jpg");

di 是传入函数的 DirectoryInfo。假设某个驱动器 k 的根目录中有一个文件 tiger.jpg。有时,结果不是 k:\tiger.jpg 而是 k:\iger.jpg。我不知道为什么或如何。有没有人有过同样的行为?

编辑 1:即使使用目录名称也会出现这种情况,因为递归函数不会列出子目录中的图像。我认为它主要是 FAT(因为它通常从 SD 卡或 USB 记忆棒等媒体读取,有时从 DVD 或 CD 读取)。

每个返回的 FileInfo 对象的全名都使用事件发出信号。接收者创建一个新对象,该对象将路径作为构造函数的参数。然后构造函数调用一个方法,该方法使用路径获取有关 jpeg 文件的信息:

FileStream fs = File.Open ( this.Path, FileMode.Open );
Image img = Image.FromStream ( fs, false, false );

这是发生异常的地方。当我从对框架组件的调用中获取文件时,我不会再次明确检查它们是否存在 - 我可以将其构建到系统中,但这并不能解决我的问题。

我忘记了一件事:这不会发生在我们的测试系统上,而是发生在全球的系统上:(

【问题讨论】:

  • 很奇怪……你确定不是对文件名进行了一些奇怪的字符串处理?
  • 当这种情况发生时,您能告诉我们什么?它只在根目录上吗?它仅在 FAT 文件系统上吗?是否总是相同的文件有问题?
  • 显示您检查收到的文件名的代码。
  • 它总是发生在相同的文件名上吗?还是每次运行时都在同一个文件上?
  • 在示例中,它出现在每个文件中。

标签: .net io


【解决方案1】:

可能是错误的稻草,但您是否尝试过逃避\

在您的k:\tiger.jpg 示例中,C# 会将\t 读取为选项卡。这不应该真的发生,但我已经看到它发生了。尝试编写它,以便将所有反斜杠替换为\\

【讨论】:

  • 我在写作中完全没有逃脱。文件名由 GetFiles 方法返回。实际上没有手动编码或输入路径。
【解决方案2】:

杀毒软件有时会在这里发挥作用。如果您有一个进程生成文件并且一个进程正在使用它,您可能会遇到竞争条件。

不是检查文件是否存在,而是调用 File.Open 然后尝试/捕获IOException。然后,您需要检查遇到异常时发生的情况。

你永远不能假设一个文件存在。

至于为什么你丢失了文件名的一个字母,你是如何生成this.Path的?

【讨论】:

  • 文件位于外部介质上。插入后,将使用 GetFiles 方法读取它们 - 因此,路径从我信任的框架方法返回以列出正确的文件名。
  • 防病毒是一个我会检查的选项。
【解决方案3】:

在这种特殊情况下,似乎是硬件的特定组合触发了一些奇怪的行为。 Win32 API 产生了正确的结果,而 .NET API 返回了错误的结果。

这并非在所有安装中都可以重现。唯一明显的区别是本地化设置,但即使在功能上更改它们也无助于我们在我们的一台本地机器上进行复制。由于将推出新的硬件版本,因此没有进一步的调查。

如果您确定您已经涵盖了其他答案中的所有建议并且遇到了同样的问题,您可能需要联系操作系统供应商。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多