首页 > 解决方案 > 如何修复随机 FileSystemEnumerableIterator.MoveNext 错误。句柄无效

问题描述

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

错误:句柄无效。

堆栈跟踪:System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileSystemEnumerableIterator`1.MoveNext() at 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 循环调用它。我该如何纠正造成这种情况的原因?

标签: c#.netconsole-application

解决方案


发生此错误是因为各种文件/目录EnumerateX方法有效地包装了本机 Win32FindFirstFile函数,并且根据其文档

如果函数失败或未能从lpFileName参数中的搜索字符串中定位文件,则返回值是INVALID_HANDLE_VALUE并且的内容lpFindFileData是不确定的。要获取扩展的错误信息,请调用该GetLastError函数。

如果我们查看Framework Reference Source 的相关部分,我们会发现任何未明确处理的错误都会以IOException. 这将包括INVALID_HANDLE_VALUE.

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


推荐阅读