【问题标题】:How to check if a file is fully copied before opening it OTHER THAN using a try catch [duplicate]如何在打开文件之前检查文件是否已完全复制,而不是使用 try catch [重复]
【发布时间】:2011-12-14 17:59:05
【问题描述】:

可能重复:
How to test if a file is fully copied in .NET

截至 2012 年,还有没有更好的方法来检查文件是否被完全复制以便在 try~catch 块中打开它?

我知道以前有人问过这个问题,并且我已经检查过 Stack Overflow 提供的自动相关问题,但它们已经存在两年多了,所以今天也许有更好的解决方案?

这是 2009 年的一个类似问题: How to test if a file is fully copied in .NET

编辑:我更改了问题的标题,因为它引发了“提问”问题。

【问题讨论】:

  • @AlejoBrz,重复一个已经提出的问题以引起新的关注,这不是 SO 的工作方式。这就是赏金的用途(尽管诚然你没有代表)。
  • 没错,正如我在我的问题上所说的,甚至添加了一个链接:-Þ 但我提到它是两年前发布的......
  • @Kirk,我不是想引起人们的注意,而是想看看是否有更好的解决方案,因为捕获错误似乎是一种非常肮脏的方法。
  • @KirkWoll 似乎真正的问题实际上并不是重复的,而是更好地表述为“如何在不使用 try-catch 的情况下使用 .Net 测试文件是否完全复制”。
  • @AlejoBrz -- 这正是我的意思。预定义的“赏金原因”之一是寻求更现代的答案,因为旧的答案已经过时了。

标签: .net file


【解决方案1】:

不,如果不使用try ... catch,仍然没有办法做到这一点,如果我是你,我不会屏住呼吸等待一个。

您真正需要的是一组函数,它们可以告诉您以特定模式打开文件的尝试是否会成功。类似File.CanOpenForExclusiveRead() 或类似的东西。 .NET 中没有此类方法,Windows API 中也不存在此类方法。并且有充分的理由。

假设存在这样的功能。也就是说,你可以这样写:

if (File.CanOpenForExclusiveRead(filename))
{
    f = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.None);
}

听起来是个好主意,对吧?除了您仍然需要在FileStream 构造函数周围放置一个try ... catch,因为其他线程(可能在另一个进程中)可能会在您的代码检查和时间你的代码调用构造函数。或者其他可能出错:文件可能被删除,磁盘可能离线等。

可以肯定的是,虚构的File.CanOpenForExclusiveRead 方法在某些情况下会很有用。但是,这些情况很少而且相差甚远,而且正如我在上面所展示的那样,它们无论如何都不会对你有很大的好处,因为无论如何你仍然必须处理可能的异常。

如果你想要一个这样做的方法,请编写你自己的方法,使用try ... catch 并在抛出异常时返回false。至少你隐藏了实现的细节。但不要等待更好的解决方案。不太可能出现。

【讨论】:

  • 感谢您的回答,我会这样做的,再也不会问了!甚至在 2020 年都不会!
猜你喜欢
  • 1970-01-01
  • 2015-04-19
  • 2012-06-29
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 2019-03-30
  • 2013-09-13
  • 1970-01-01
相关资源
最近更新 更多