读取文件而不会导致对其他进程的访问被拒绝
Reading a file without causing access denial to other processes
我一直在想写一个小的专门的备份应用程序,类似于Windows8中新引入的文件历史。基本的想法是每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 可能被其他(写?)请求 "broken"。
This FileIO.ReadTextAsync 的行为看起来和我想要的一模一样,但它看起来也非常特定于实现,将来可能会更改。有人知道如何通过 C# 或 C++ 在本地显式 oplock 文件吗?
也许有一些像 File.TryReadBytes 这样的简单 C# 方法可以提供这样的 "polite" 读取?我对适用于 Windows 7 及更高版本的解决方案很感兴趣。
我投票给 VSS。主要原因是它不会干扰其他进程修改您的文件,因此它提供了一致性。可能的不一致几乎会破坏备份的目的。 API 很稳定,我不会担心它的未来。
我一直在想写一个小的专门的备份应用程序,类似于Windows8中新引入的文件历史。基本的想法是每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 可能被其他(写?)请求 "broken"。
This FileIO.ReadTextAsync 的行为看起来和我想要的一模一样,但它看起来也非常特定于实现,将来可能会更改。有人知道如何通过 C# 或 C++ 在本地显式 oplock 文件吗?
也许有一些像 File.TryReadBytes 这样的简单 C# 方法可以提供这样的 "polite" 读取?我对适用于 Windows 7 及更高版本的解决方案很感兴趣。
我投票给 VSS。主要原因是它不会干扰其他进程修改您的文件,因此它提供了一致性。可能的不一致几乎会破坏备份的目的。 API 很稳定,我不会担心它的未来。