我在递归调用中使用以下代码:
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 );
这是异常发生的地方。当我从调用框架组件中获取文件时,我没有再次明确地检查它们是否存在 - 我可以将它构建到系统中,但这并不能解决我的问题。
我忘记了一件事:这不会发生在我们的测试系统上,而是发生在全球范围内的系统上:(
答案 0 :(得分:3)
可能是错误的吸管,但您是否尝试过转发\
。
在k:\tiger.jpg
的示例中,C#会将\t
作为标签阅读。这不应该发生,但我已经看到它发生了。尝试编写它,以便用\\
答案 1 :(得分:1)
防病毒有时可以在这里发挥作用。如果您有一个生成该文件的进程和一个正在使用它的进程,则可能存在竞争条件。
不是检查文件是否存在,而是调用File.Open然后尝试/ catch来查找IOException
。然后,您需要检查遇到异常时发生的情况。
你永远不能假设文件存在。
至于为什么丢失文件名的字母,如何生成this.Path
?
答案 2 :(得分:1)
在这种特殊情况下,似乎是硬件的特定组合引发了一些奇怪的行为。 Win32 API提供了正确的结果,而.NET API返回了错误的结果。
这在所有安装中都不可重现。唯一明显的区别是本地化设置,但即使在功能上更改它们也没有帮助我们在我们的本地计算机上创建一个repro。随着新的硬件版本的推出,没有进一步的调查。
如果您确定已涵盖其他答案中的所有提案并遇到同样的问题,则可能需要与操作系统供应商联系。