观察
我有一个应用程序,我被告知已运行了几年没有任何问题,但最近开始崩溃与一个奇怪的错误。代码本身很简单:
private void fileSystemWatcher_Changed(object sender, FileSystemEventArgs e)
{
//Make sure it's not a folder that was modified
if (!Directory.Exists(e.FullPath))
{
var creationTime = File.GetCreationTime(e.FullPath);
// Rest of the code here...
但是,对GetCreationTime
的调用偶尔会引发异常,产生以下调用堆栈:
System.IO.IOException: There are no more files. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.File.GetCreationTimeUtc(String path) at MyClass.fileSystemWatcher_Changed(Object sender, FileSystemEventArgs e) at ...
现在,我已经清除GetCreationTime
上的MSDN documentation并使用ILSpy仔细检查了代码,并得出以下结论:
System.IO.File.GetCreationTime
方法是等效的Win API调用集的高级包装器,包括GetFileAttributesEx
和FindFirstFile
。我不相信任何这些调用应该返回错误18.实际上,.NET实现有一组特定的硬编码错误(2,3和21),以及在大多数情况下,只会吃异常并返回DateTime.MinValue
。
问题
可能导致此异常的原因是什么,以及对代码避免或阻止它的最佳纠正措施是什么? (现在,我在块周围添加了try catch
来记录事件并忽略。)
这可能是Windows操作系统问题(类似于旧的KB article)吗?
答案 0 :(得分:0)
您的代码正在检查路径不是目录。 false
响应并不意味着路径指向文件,也可能意味着此名称没有任何内容。
改为使用File.Exists
:
if (FileExists(e.FullPath))
{
var creationTime = File.GetCreationTime(e.FullPath);