在C#中读/写锁



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

据我了解,此代码背后的逻辑是:第一个文件使用read/write(fileaccess.readwrite(打开文件,并为后续用户(fileShare.Read(设置文件。

第二次打开时,它将尝试使用读/写入并打开它,但仅限于读取它会触发异常并转到第二个语句。在那里,它将以仅读取(fileaccess.read(打开文件,并将其设置为后续用户的read-write(fileaccess.readwrite(,这是为了确保第一个文档不会被锁定在其已允许的写入权利中,这导致例外。

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

我错过了什么,还是有fluke,以便它暂时起作用?

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

正如我们在注释中所说的那样 - 原因是文件流的过早关闭。当然,当您关闭文件流时 - 释放了所有锁。按照您在评论中建议的整个应用程序运行时间的持续时间,将文件打开不是一个好主意 - 只需在完成该文件时关闭文件,不是很早,但不要以后。

最新更新