如何修复随机 FileSystemEnumerableIterator.MoveNext 错误。句柄无效

时间:2021-05-17 16:09:50

标签: c# .net console-application

我刚开始在一个运行多年的程序上随机出现错误。该程序所做的只是查看一组目录并根据上次写入时间删除文件。 这是错误和堆栈跟踪。

<块引用>

错误:句柄无效。

堆栈跟踪:在 System.IO.__Error.WinIOError(Int32 errorCode, String mayFullPath) 在 System.IO.FileSystemEnumerableIterator`1.MoveNext() 在 DirectoryCleaner.Program.GetNewFiles()

这是代码


DirectoryInfo di = new DirectoryInfo(sourcePath);
foreach (FileSystemInfo file in di.EnumerateFileSystemInfos(variablePattern == true ? "*" : SearchPattern, searchSubDirectories == true ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly))
{ 
creates queue of records to delete. I removed the logic as it is rather long... 
}

我花了几个小时搜索。我发现 System.IO.IOException: The handle is invalid, when using Directory.EnumerateDirectories 但它没有答案。

堆栈跟踪显示它在我没有直接调用的 MoveNext 方法中。我假设 foreach 循环调用它。我该如何纠正导致这种情况的原因?

1 个答案:

答案 0 :(得分:0)

发生此错误的原因是各种文件/目录 EnumerateX 方法实际上是围绕本机 Win32 FindFirstFile 函数和 as per its documentation 的包装器:

<块引用>

如果函数失败或无法从 lpFileName 参数中的搜索字符串定位文件,返回值为 INVALID_HANDLE_VALUElpFindFileData 的内容是不确定的。要获取扩展错误信息,请调用 GetLastError 函数。

如果我们查看 relevant portion of the Framework Reference Source,我们会看到任何未明确处理的错误都显示为 IOException。这将包括 INVALID_HANDLE_VALUE

换句话说,这是调用 EnumerateX 方法时预期的潜在异常,您的代码应该通过捕获泛型 IOException 来正确处理它。各种 EnumerateX 方法的文档未能指出这一点,这是 IMO 的一个遗漏,因此我已经 opened an issue 解决了这个问题。