读取文件而不会导致访问拒绝其他进程

时间:2015-01-01 16:56:41

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

我一直在考虑编写一个小型专用备份应用程序,类似于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"通过其他(写?)请求。

FileIO.ReadTextAsync的

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

也许有一些简单的C#方法,如File.TryReadBytes,提供了这样的"礼貌"读?我对可在Windows 7及更高版本上运行的解决方案感兴趣。

1 个答案:

答案 0 :(得分:1)

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