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

How to fix random FileSystemEnumerableIterator.MoveNext Error. The handle is invalid

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

Error: The handle is invalid.

Stack Trace: at 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 循环调用它。我该如何纠正造成这种情况的原因?

发生此错误是因为各种 file/directory EnumerateX 方法有效地包装了本机 Win32 FindFirstFile 函数,并且 as per its documentation:

If the function fails or fails to locate files from the search string in the lpFileName parameter, the return value is INVALID_HANDLE_VALUE and the contents of lpFindFileData are indeterminate. To get extended error information, call the GetLastError function.

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

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