【问题标题】:Uncertain about file-locking mechanism in C#.NET不确定 C#.NET 中的文件锁定机制
【发布时间】: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


【解决方案1】:

...在应用程序崩溃时会发生任何事情

并不特别,当操作系统清理弹片并关闭任何未被应用关闭的文件时,锁会立即释放。

打开文件时失去网络连接会发生什么?

你会得到一个运行时异常,IOException。只能通过恢复网络连接并重新打开文件来恢复。网络通常足够可靠,可以考虑不自动执行此操作,YMMV。

是否有任何理由(另外)使用 FileStream.Lock() ...

没有。这些功能锁定文件数据而不是文件访问。数据库引擎会做的事情。它永远不会应用于文本文件,因为它们是流,并且您永远不知道文件中一行文本的确切文件位置。

服务器的系统是否需要任何东西...

不,这是操作系统内置的。

我还有其他需要考虑的地方吗?

您可能应该更多地考虑编写文件,有人将不得不这样做。使用 FileShare.None 很简单,但对于文本文件来说往往有点粗糙,尤其是当它们是始终保持打开状态的日志文件时。从技术上讲,应用程序可以读取正在写入的文件。往往结果很好,因为文本文件只被附加到。您将在写入文件的应用程序中使用 FileShare.Read,在读取文件的应用程序中使用 FileShare.ReadWrite。不是错别字。

【讨论】:

  • 感谢您的出色回答。你能解释一下,或者分享一个链接,为什么系统 B 知道系统 A 实际上正在处理网络共享上的文件?
  • 系统 B 不知道,它询问拥有该文件的系统。网络重定向器的工作。我不知道任何链接。
  • 另外,可以在我之前的问题中回答,如果锁定系统立即崩溃(关闭),文件如何识别它不再被锁定?
  • 文件什么都不知道,操作系统知道。它通过它们的句柄跟踪打开的文件并仲裁对底层文件对象的访问。关闭文件会告诉操作系统停止跟踪。
【解决方案2】:

您所指的文件锁定是在操作系统级别完成的。因此,如果您的应用程序崩溃、出错等,它将释放文件。这适用于 Q1 和 Q2(尽管 Q2 取决于网络拓扑和后备存储)。当心锁定文件可能会导致启用缓冲的后备存储出现奇怪的性能问题。 Q3、Lock、Unlock指的不是文件锁,而是文件内的字节。这是一个完全不同的概念,它会导致你在 NAS 类型存储上出现奇怪的行为 Q4,就像我之前所说的,它是一个操作系统级别的概念。 Q5。考虑一种更好的管理方式,使用文件是一个相对古老的概念,但是,在网络上的多台计算机之间共享文件,恕我直言,要求奇怪的抓头行为。现代文件存储不适合这个概念,并且由于缓冲、延迟和安全性,它变得具有挑战性。尽可能避免它。如果做不到这一点,请确保优化您的应用程序,以便它尽快打开文件、写入、关闭和刷新流。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 2020-12-22
    • 1970-01-01
    • 2021-08-14
    • 2014-07-13
    相关资源
    最近更新 更多