【问题标题】:Read/Write lock in c#c#中的读/写锁
【发布时间】:2017-04-28 09:39:52
【问题描述】:

我们的应用程序需要在第一次打开文件时将其锁定为只读。我有下面的代码,它似乎不再起作用了。 现在,由于某种原因,当我打开第二个文件并且每次都通过第一个语句时,它永远不会触发异常。

据我了解,这段代码背后的逻辑是这样的:第一个文件以读/写方式打开文件 (FileAccess.ReadWrite),并将文件设置为后续用户读取 (FileShare.Read)。

当它第二次打开时,它会尝试用读/写打开它,但仅限于只读,它会触发异常并转到第二条语句。在那里它将以只读方式打开文件(FileAccess.Read)并将其设置回读写(FileAccess.ReadWrite)以供后续用户使用,以确保第一个文档不会被锁定在其已经允许的写入权限之外,导致异常。

我已经对此进行了测试,它曾经与以下代码一起使用。我仍然可以验证是否设置了读锁。当我在另一个 PDF 编辑器中打开文件时,它无法保存,只能阅读。当我在自己的应用程序中执行此操作时,我可以随时保存。

我是不是遗漏了什么,还是因为侥幸暂时起作用了?

try
 {
    m_FileStream = File.Open(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.Read);
    m_bCanWrite = true;
 }
 catch (Exception)
 {
    m_FileStream = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
    m_bCanWrite = false;
 }

我更改了代码,使其使用 using 块,具有相同的参数,但结果也是相同的。

try
                {
                    FileInfo info = new FileInfo(fileName);
                    using (FileStream readWriteStream = info.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.Read))
                    {
                        m_bcanWrite = true;
                        m_PdfDocument = new PDFDoc(readWriteStream);
                    }

                }
                catch (Exception) 
                {
                    FileInfo info = new FileInfo(fileName);
                    using (FileStream readStream = info.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                    {
                        m_bcanWrite = false;
                        m_PdfDocument = new PDFDoc(readStream);
                    }

                }

【问题讨论】:

  • 您没有在这两个打开之前关闭\处理文件流?如果不是 - 它应该可以工作(即 - 当您第二次尝试打开文件时抛出异常)。
  • 很遗憾没有。尤其是 using 块,它们不会被过早地处理掉。
  • 在您提供的代码中(使用 usings),它们似乎在创建 m_pdfDocument 后立即被处理。
  • 是的,不是吗?还是必须保持开放才能执行访问策略?
  • 这就是我要问的。当然它必须保持打开状态。

标签: c# io filestream file-access


【解决方案1】:

正如我们在 cmets 中发现的那样 - 原因是文件流过早关闭。当然,当您关闭文件流时 - 其上的所有锁都会被释放。正如您在评论中所建议的那样,在整个应用程序运行期间保持文件打开并不是一个好主意 - 完成后关闭文件,不要越早越好。

【讨论】:

    猜你喜欢
    • 2010-09-19
    • 2011-01-21
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 2011-12-04
    • 1970-01-01
    相关资源
    最近更新 更多