c# - 如何修复随机 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 循环调用它。我该如何纠正造成这种情况的原因?
解决方案
发生此错误是因为各种文件/目录EnumerateX
方法有效地包装了本机 Win32FindFirstFile
函数,并且根据其文档:
如果函数失败或未能从
lpFileName
参数中的搜索字符串中定位文件,则返回值是INVALID_HANDLE_VALUE
并且的内容lpFindFileData
是不确定的。要获取扩展的错误信息,请调用该GetLastError
函数。
如果我们查看Framework Reference Source 的相关部分,我们会发现任何未明确处理的错误都会以IOException
. 这将包括INVALID_HANDLE_VALUE
.
换句话说,这是调用方法时预期的潜在异常EnumerateX
,您的代码应该通过捕获泛型来正确处理它IOException
。各种方法的文档EnumerateX
未能指出这一点,IMO 是一个遗漏,因此我已经打开了一个问题来解决这个问题。
推荐阅读
- python - python untar linux 等价物
- python - 将大型 json 文件读入 pandas 数据帧
- xamarin - Xamarin Forms Image 未显示
- c# - 在 C# 中将 byte[] 转换为类的实例
- c++ - 从多个 C/C++ 线程调用 Haskell
- reactjs - 设置具有多个入口点的 webpack 配置的最佳方法
- sql - PostgreSQL 11:使用 json_object_agg() 的多个键值对
- javascript - 如何在数组中添加消息?
- html - 单击列后排序图标更改位置
- abap - 如何从 DB 表中选择 LRAW?