我正在尝试使用PDFTron在UWP环境中运行的应用程序中创建PDF文件。我能够成功创建一个文件。根据用户输入,可能需要重命名或从系统中完全删除新创建的文件。虽然当我尝试访问刚刚创建的文件时,系统会抛出以下异常:
final String input = "2022-03-17T23:00:00.000+0000";
try {
OffsetDateTime.parse(input);
LocalDateTime.parse(input, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
}
catch (DateTimeParseException e) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SZ", Locale.GERMANY);
sdf.parse(input);
}
以下部分显示了要创建的文件的用途:
Exception thrown: 'System.IO.IOException' in System.IO.FileSystem.dll The process cannot access the file (filename) because it is being used by another process.
这是我的删除实现:
await sdfDoc.SaveAsync(filePath, SDFDocSaveOptions.e_linearized, "%PDF-1.5");
sdfDoc.Dispose();
文件的创建在单独的任务上运行,并且在按下按钮时进行删除。
我理解异常的性质,虽然我想知道在创建文件后文件的资源是否从PDFTron返回到系统?
非常感谢任何帮助或指示。
谢谢。
答案 0 :(得分:0)
PDFNet在内部使用引用计数来知道何时释放文件系统句柄和内存。
例如,以下内容将触发文件仍处于锁定状态的问题。
PDFDoc doc = new PDFDoc(input_filename);
doc.InitSecurityHandler();
SDFDoc sdfdoc = doc.GetSDFDoc();
await sdfdoc.SaveAsync(output_file_path, SDFDocSaveOptions.e_linearized, "%PDF-1.5");
sdfdoc.Dispose();
await Task.Run(() => File.Delete(output_file_path)); // fails, as PDFDoc still has reference.
但这会按预期工作。
using(PDFDoc doc = new PDFDoc(input_filename))
{
doc.InitSecurityHandler();
SDFDoc sdfdoc = doc.GetSDFDoc();
await sdfdoc.SaveAsync(output_file_path, SDFDocSaveOptions.e_linearized, "%PDF-1.5");
sdfdoc.Dispose();
}
await Task.Run(() => File.Delete(output_file_path)); // works
请注意PDFDoc实例的using
语句以及手动处理SDFDoc实例,尽管您也可以使用using
语句。