【问题标题】:Reading a file without causing access denial to other processes读取文件而不导致拒绝其他进程的访问
【发布时间】:2015-01-01 16:56:41
【问题描述】:

我一直在考虑编写一个小型专用备份应用程序,类似于 Windows 8 中新引入的文件历史记录。基本思想是每 N 小时扫描一些目录以查找更改的文件并将它们复制到另一个卷。问题是,其他一些应用程序可能会在备份这些文件时请求访问这些文件并被拒绝访问,这可能会导致各种令人讨厌的问题。

据我所知,有几种方法可以解决这个问题:

1) 使用卷影复制服务

在我看来,这个东西的未来是不确定的,它在大量 IO 负载期间的开销可能会削弱系统。

2) 打开文件时使用共享模式

这样的东西大多是有效的......

using (var stream = new FileStream("test.txt", FileMode.Open, FileAccess.Read,
    FileShare.Delete | FileShare.ReadWrite | FileShare.Read | FileShare.Write))
{
    [Copy data]
}

...直到其他进程请求访问同一文件而不使用 FileShare.Read,此时将抛出 IOException。

3) 使用可能被其他(写入?)请求“破坏”的Opportunistic Lock

This FileIO.ReadTextAsync 的行为看起来与我想要的完全一样,但它看起来也非常特定于实现,并且将来可能会更改。有人知道,如何通过 C# 或 C++ 在本地显式锁定文件吗?

也许有一些简单的 C# 方法,比如 File.TryReadBytes 可以提供这种“礼貌”的阅读方式?我对适用于 Windows 7 及更高版本的解决方案感兴趣。

【问题讨论】:

  • 您了解备份非静止或阴影文件系统所涉及的问题吗?应用程序不会对文件进行原子更新?那相关文件可能保存在不一致的状态?这可能是个坏主意。
  • @HABO 这取决于。在具有高连接性和频繁更新的大型数据库的情况下,这确实是一个可怕的想法,但在大量不相关且大部分是静态文件的存储的情况下,通常很少会隔离潜在的不一致,因此不会破坏交易。我只关心后一种情况。
  • OpLocks 是一种网络功能,而不是本地功能。我相信您还遗漏了另一点:您的应用程序可能是第一个或第二个请求锁定的应用程序。这两种情况都可能导致问题,但如果你是第一个,那么其他程序将遇到 IO 异常。

标签: c# c++ windows backup volume-shadow-service


【解决方案1】:

我对 VSS 投了赞成票。主要原因是它不会干扰修改文件的其他进程,因此它提供了一致性。可能的不一致几乎破坏了备份的目的。 API 很稳定,我不会担心它的未来。

【讨论】:

  • 我担心大量存储不相关且主要是静态文件的情况。不一致不会破坏整个事情,恢复 99.9% 通常就足够了。我想文件历史记录只是为了这种场合而制作的,只是没有一些我想要的功能。
猜你喜欢
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 2010-09-22
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
相关资源
最近更新 更多