C# c语言中的读写锁#

C# c语言中的读写锁#,c#,io,filestream,file-access,C#,Io,Filestream,File Access,我们的应用程序需要在第一次打开文件时将其锁定为只读。我有下面的代码,它似乎不再工作了。 现在,由于某种原因,当我打开第二个文件并且每次只传递第一条语句时,它不会触发异常 据我所知,这段代码背后的逻辑是:第一个文件以读/写方式(FileAccess.ReadWrite)打开文件,并为后续用户设置要读取的文件(FileShare.Read) 当第二次打开它时,它将尝试以读/写方式打开它,但被限制为只读,并触发异常并转到第二条语句。在那里,它将以只读(FileAccess.Read)方式打开文件,并为

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

据我所知,这段代码背后的逻辑是:第一个文件以读/写方式(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;
 }
我更改了代码,使其使用具有相同参数的块,但结果也是相同的

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

                }

正如我们在评论中指出的,原因是文件流过早关闭。当然,当您关闭filestream时,它上的所有锁都会被释放。按照您在评论中的建议,在整个应用程序运行期间保持文件处于打开状态不是一个好主意-只需在处理完文件后关闭该文件,不要早,也不要晚。

在这两个文件打开之前,您不关闭\disposing filestream吗?若并没有,那个么它应该可以工作(也就是说,当你们第二次试图打开文件时抛出异常)。特别是使用块,它们不可能被过早地处理。在您提供的代码(使用)中,它们似乎在创建m_pdfDocument后立即被处理。是的,不是吗?或者它必须保持开放以执行访问策略?这就是我要问的。当然,它必须保持开放。