我刚开始在一个运行多年的程序上随机出现错误。该程序所做的只是查看一组目录并根据上次写入时间删除文件。 这是错误和堆栈跟踪。
<块引用>错误:句柄无效。
堆栈跟踪:在 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 循环调用它。我该如何纠正导致这种情况的原因?
答案 0 :(得分:0)
发生此错误的原因是各种文件/目录 EnumerateX
方法实际上是围绕本机 Win32 FindFirstFile
函数和 as per its documentation 的包装器:
如果函数失败或无法从 lpFileName
参数中的搜索字符串定位文件,返回值为 INVALID_HANDLE_VALUE
和 lpFindFileData
的内容是不确定的。要获取扩展错误信息,请调用 GetLastError
函数。
如果我们查看 relevant portion of the Framework Reference Source,我们会看到任何未明确处理的错误都显示为 IOException
。这将包括 INVALID_HANDLE_VALUE
。
换句话说,这是调用 EnumerateX
方法时预期的潜在异常,您的代码应该通过捕获泛型 IOException
来正确处理它。各种 EnumerateX
方法的文档未能指出这一点,这是 IMO 的一个遗漏,因此我已经 opened an issue 解决了这个问题。