截至2012年,还是没有更好的方法来检查文件是否被完全复制,以便在try~track块中打开它?
我知道之前已经被问到并且我已经检查了Stack Overflow提供的自动相关问题,但它们已经超过两年了,所以今天可能有更好的解决方案吗?
这是2009年的一个类似问题: How to test if a file is fully copied in .NET
编辑:我改变了问题的标题,因为它提出了“请求”问题。
答案 0 :(得分:2)
不,如果不使用try ... catch
,仍然无法做到这一点,如果我是你,我就不会屏住呼吸等待。
您真正要求的是一组功能,可以告诉您在特定模式下打开文件的尝试是否成功。像File.CanOpenForExclusiveRead()
或类似的东西。 .NET中没有这样的方法,它们在Windows API中不存在。并且有充分的理由。
假设存在这样的功能。也就是说,你可以写:
if (File.CanOpenForExclusiveRead(filename))
{
f = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.None);
}
听起来不错,对吧?除非您仍需要在try ... catch
构造函数周围放置一个FileStream
,因为某些其他线程(可能在另一个进程中)可能会打开该文件以便在您的时间之间进行独占读取检查代码和代码调用构造函数的时间。或者其他可能出错的地方:文件可能被删除,磁盘可能会脱机等等。
可以肯定的是,虚构的File.CanOpenForExclusiveRead
方法在某些情况下会很有用。但是,这些案例很少,而且正如我上面所说的那样,无论如何它们都不会给你带来太大的好处,因为你仍然需要处理可能的例外。
如果你想要一个执行该操作的方法,编写自己使用try ... catch
的方法,如果抛出异常则返回false
。至少然后你隐藏了实现的细节。但不要等待更好的解决方案。一个人即将到来的可能性很小。