c#中的读/写锁定

时间:2017-04-28 09:39:53

标签: c# io filestream file-access

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

根据我的理解,这段代码背后的逻辑是这样的:第一个文件打开带有读/写(FileAccess.ReadWrite)的文件,并将文件设置为Read for later users(FileShare.Read)。

当它第二次打开时,它会尝试用Read / Write打开它,但是它被限制为Read-Only,它会触发异常并转到第二个语句。它将以只读(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;
 }

我更改了代码,因此它使用了使用相同参数的块,但结果也相同。

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);
                    }

                }

1 个答案:

答案 0 :(得分:1)

正如我们在评论中指出的那样 - 原因是文件流过早关闭。当然,当你关闭文件流时 - 它上面的所有锁都被释放了。按照您在评论中的建议,在整个应用程序运行时间内保持文件打开不是一个好主意 - 只需在完成后关闭文件,而不是更早但不是更晚。