【发布时间】:2016-06-07 13:15:48
【问题描述】:
在我的测试环境中,我有两个物理 Windows 7 客户端。两者都可以访问托管在 Windows Server 系统上的网络共享。
客户端分别运行一个应用程序,该应用程序可能会尝试同时对同一个文本文件进行操作(读取或写入)。
我想用FileInfo.Open()方法实现不同的场景:
场景一:应用允许同时阅读。如果另一个实例实际上正在写入它,它应该会失败。
我会用
FileInfo fi = new FileInfo(filePath);
using (FileStream fs = fi.Open(FileMode.Open, FileAccess.Read, FileShare.Read))
{
// Do some read operations...
Console.WriteLine("Press ENTER to close file-stream...");
Console.ReadLine();
}
为此。
场景 2: 尝试写入文件时,仅允许一个实例打开文件。如果任何其他实例实际上正在读取它,它应该会失败。
我会用
FileInfo fi = new FileInfo(filePath);
using (FileStream fs = fi.Open(FileMode.Open, FileAccess.Write, FileShare.None))
{
// Do some write operations...
Console.WriteLine("Press ENTER to close file-stream...");
Console.ReadLine();
}
为此。
使用上面的 code-sn-ps,我的场景按预期工作。即使我在 using(...) 语句中关闭了一个实例,该文件仍被“解锁”。
Q1:我想如果应用程序崩溃会发生什么事情,那么其他实例对该文件的访问将被拒绝(几次?)。
Q2:打开文件时失去网络连接会发生什么?
Q3:是否有任何理由(另外)使用FileStream.Lock() 和Unlock() 方法来显式锁定和解锁文件?
Q4:服务器系统是否需要任何东西才能使这种文件锁定方式运行?
Q5:我还有其他需要考虑的地方吗?
【问题讨论】:
-
考虑如果有人试图使用您无法控制的程序打开/修改文件会发生什么。他们不会总是使用您期望的锁类型。
-
@CathalMF 好点。但我认为,就我而言,这取决于最终用户是否不这样做。人们(希望)知道他们在做什么:-)
-
我们都希望我们的用户知道他们在做什么。但总有那么一个人!!只要确保您的应用程序不会在有人使用共享权限和读/写的某种组合打开文件时爆炸。
标签: c# file-locking