iText7 - PdfReader 构造函数锁定非 pdf 文件
iText7 - PdfReader constructor locks non-pdf files
考虑以下 C# 代码:
try
{
using (new PdfReader(filename))
{
}
}
catch
{
}
finally
{
File.Delete(filename);
}
如果 filename
指向非 pdf 文件,PdfReader
构造函数将抛出异常(如预期的那样),但也不会释放它内部创建的 FileStream
,尽管在 using
块中调用。因此,尝试删除 finally
块中的文件会引发异常 The process cannot access the file '<filename>' because it is being used by another process.
事实上,如果构造函数抛出异常,它不应该导致锁定任何资源。因此,即使在没有 using
块的情况下调用 PdfReader
构造函数,上面的代码也应该删除非 pdf 文件。
明显的解决方法是像这样实例化 PdfReader
:
using (var fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read))
using (new PdfReader(fileStream))
{
}
它确实有效,但 PdfReader
构造函数使用 filename
参数重载的当前行为不符合预期。
这确实是 iText 的一个错误,但它是一个已知问题,并且已经在最新的开发版本中修复。 iText 7.1.16 版本将包含此修复程序,但如果您现在需要此修复程序,您可以使用人工制品 https://repo.itextsupport.com/webapp/#/artifacts/browse/tree/General/snapshot
中的 SNAPSHOT 版本
考虑以下 C# 代码:
try
{
using (new PdfReader(filename))
{
}
}
catch
{
}
finally
{
File.Delete(filename);
}
如果 filename
指向非 pdf 文件,PdfReader
构造函数将抛出异常(如预期的那样),但也不会释放它内部创建的 FileStream
,尽管在 using
块中调用。因此,尝试删除 finally
块中的文件会引发异常 The process cannot access the file '<filename>' because it is being used by another process.
事实上,如果构造函数抛出异常,它不应该导致锁定任何资源。因此,即使在没有 using
块的情况下调用 PdfReader
构造函数,上面的代码也应该删除非 pdf 文件。
明显的解决方法是像这样实例化 PdfReader
:
using (var fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read))
using (new PdfReader(fileStream))
{
}
它确实有效,但 PdfReader
构造函数使用 filename
参数重载的当前行为不符合预期。
这确实是 iText 的一个错误,但它是一个已知问题,并且已经在最新的开发版本中修复。 iText 7.1.16 版本将包含此修复程序,但如果您现在需要此修复程序,您可以使用人工制品 https://repo.itextsupport.com/webapp/#/artifacts/browse/tree/General/snapshot
中的 SNAPSHOT 版本