File.GetCreationTime返回Win32错误18 - 没有更多文件

时间:2015-04-24 12:56:31

标签: c#

观察

我有一个应用程序,我被告知已运行了几年没有任何问题,但最近开始崩溃与一个奇怪的错误。代码本身很简单:

private void fileSystemWatcher_Changed(object sender, FileSystemEventArgs e)
{
    //Make sure it's not a folder that was modified
    if (!Directory.Exists(e.FullPath))
    {
        var creationTime = File.GetCreationTime(e.FullPath);

        // Rest of the code here...

但是,对GetCreationTime的调用偶尔会引发异常,产生以下调用堆栈:

System.IO.IOException: There are no more files.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.File.GetCreationTimeUtc(String path)
   at MyClass.fileSystemWatcher_Changed(Object sender, FileSystemEventArgs e) 
   at ...

现在,我已经清除GetCreationTime上的MSDN documentation并使用ILSpy仔细检查了代码,并得出以下结论:

System.IO.File.GetCreationTime方法是等效的Win API调用集的高级包装器,包括GetFileAttributesExFindFirstFile。我不相信任何这些调用应该返回错误18.实际上,.NET实现有一组特定的硬编码错误(2,3和21),以及在大多数情况下,只会吃异常并返回DateTime.MinValue

问题

可能导致此异常的原因是什么,以及对代码避免或阻止它的最佳纠正措施是什么? (现在,我在块周围添加了try catch来记录事件并忽略。)

这可能是Windows操作系统问题(类似于旧的KB article)吗?

1 个答案:

答案 0 :(得分:0)

您的代码正在检查路径不是目录。 false响应并不意味着路径指向文件,也可能意味着此名称没有任何内容。

改为使用File.Exists

if (FileExists(e.FullPath))
{
    var creationTime = File.GetCreationTime(e.FullPath);