C# - 为什么System.IO.File.GetLastAccessTime在找不到文件时返回预期值?

Sas*_*nyi 13 c# error-handling exception

请解释一下你的想法.

1.  DateTime dt = System.IO.File.GetLastAccessTime("C:\\There_is_no_such_file.txt");
2.  DateTime dt = System.IO.File.GetLastAccessTime("");
Run Code Online (Sandbox Code Playgroud)
  1. 如果path参数中描述的文件不存在,则此方法返回到公元1601年1月1日午夜12点(CE)协调世界时(UTC),调整为当地时间.

  2. 在第二种情况下抛出参数异常.

为什么在第一种情况下不抛出FileNotFoundException(或smth.simmilar)?

Han*_*ant 11

这是记录在案的行为.从MSDN Library主题中的"备注"部分:

如果path参数中描述的文件不存在,则此方法返回到公元1601年1月1日午夜12点(CE)协调世界时(UTC),调整为当地时间.

传递空字符串时获得的异常是由检查传递的字符串是否为有效路径名的代码生成的异常.这是公平的,这将是程序中的错误.

代码是明确的,因此不是由监督或错误完成的.它使用FindFirstFile()API函数来定位文件.如果失败,则检查Windows错误.并明确忽略,"未找到文件","未找到路径"和"驱动器忙"错误.

请注意,提供使用File.Exists的解决方案实际上并不能解决此问题.Windows是一种多任务操作系统.在Exists调用之后,您的线程可能会被抢占,而另一个进程可能会删除该文件.当你的线程重新获得CPU时,你仍然会得到虚假的日期.

获得准确日期的唯一保证方法是首先打开文件,这样任何人都无法删除您下面的文件.我认为这解释了为什么该方法的行为与它一样.框架设计师被困在岩石和坚硬的地方之间.如果他们首先打开文件,他们就有可能冒着其他程序轰炸文件共享错误的风险.如果他们不首先打开文件,他们就会冒着程序随机爆炸的风险.非常难以诊断.不得不在两种不愉快的选择之间做出选择,他们选择了不会炸弹的东西.

Anyhoo,通过打开文件使其可靠.