我们的应用程序需要将文件锁定为第一次打开时的文件。我有下面的代码,似乎不再起作用。现在,由于某种原因,当我打开第二个文件并每次都通过第一个语句时,它从不触发异常。
据我了解,此代码背后的逻辑是:第一个文件使用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);
}
}
正如我们在注释中所说的那样 - 原因是文件流的过早关闭。当然,当您关闭文件流时 - 释放了所有锁。按照您在评论中建议的整个应用程序运行时间的持续时间,将文件打开不是一个好主意 - 只需在完成该文件时关闭文件,不是很早,但不要以后。