如何修复随机 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 解决了这个问题。
我刚开始在一个 运行 多年的程序上随机出现错误。这个程序所做的就是查看一组目录并根据上次写入时间删除文件。 这是错误和堆栈跟踪。
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 isINVALID_HANDLE_VALUE
and the contents oflpFindFileData
are indeterminate. To get extended error information, call theGetLastError
function.
如果我们查看 relevant portion of the Framework Reference Source,我们会发现任何未明确处理的错误都会显示为 IOException
。这将包括 INVALID_HANDLE_VALUE
.
换句话说,这是预期的潜在异常,同时调用 EnumerateX
方法,您的代码应该通过捕获通用 IOException
来正确处理它.各种 EnumerateX
方法的文档未能指出这一点,IMO 是一个遗漏,因此我已经 opened an issue 解决了这个问题。