我一直在考虑编写一个小型专用备份应用程序,类似于 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)使用可能被其他(写?)请求“破坏”的机会锁。
FileIO.ReadTextAsync 的这种行为看起来与我想要的完全一样,但它看起来也非常特定于实现,并且将来可能会更改。有人知道如何通过 C# 或 C++ 在本地显式锁定文件吗?
也许有一些像 File.TryReadBytes 这样的简单 C# 方法可以提供这种“礼貌”的阅读方式?我对适用于 Windows 7 及更高版本的解决方案感兴趣。