Read/Write 锁定 C#
Read/Write lock in c#
我们的应用程序需要在文件第一次打开时将其锁定为只读。我有下面的代码,它似乎不再起作用了。
现在,由于某种原因,当我打开第二个文件并且每次都通过第一个语句时,它永远不会触发异常。
据我了解,此代码背后的逻辑是:第一个文件使用 Read/Write (FileAccess.ReadWrite) 打开文件并将文件设置为供后续用户读取 (FileShare.Read).
第二次打开时,它会尝试用Read/Write打开它,但被限制为只读,触发异常并转到第二条语句。在那里它将以只读(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);
}
}
正如我们在评论中发现的那样 - 原因是文件流过早关闭。当然,当您关闭文件流时 - 它的所有锁都会被释放。正如您在评论中建议的那样,在整个应用程序 运行 时间内保持文件打开不是一个好主意 - 完成后关闭文件,不要早点但不要晚点。
我们的应用程序需要在文件第一次打开时将其锁定为只读。我有下面的代码,它似乎不再起作用了。 现在,由于某种原因,当我打开第二个文件并且每次都通过第一个语句时,它永远不会触发异常。
据我了解,此代码背后的逻辑是:第一个文件使用 Read/Write (FileAccess.ReadWrite) 打开文件并将文件设置为供后续用户读取 (FileShare.Read).
第二次打开时,它会尝试用Read/Write打开它,但被限制为只读,触发异常并转到第二条语句。在那里它将以只读(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);
}
}
正如我们在评论中发现的那样 - 原因是文件流过早关闭。当然,当您关闭文件流时 - 它的所有锁都会被释放。正如您在评论中建议的那样,在整个应用程序 运行 时间内保持文件打开不是一个好主意 - 完成后关闭文件,不要早点但不要晚点。