Reputation: 31
I am trying to create PDF file using PDFTron in application which runs in the UWP environment. I am able to create a file successfully. Depending on user input that newly created file might need to be renamed or completely deleted from the system. Although when I try to access the file that was just created the system throws the following exception:
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.
The following part show what is used for the file to be created:
await sdfDoc.SaveAsync(filePath, SDFDocSaveOptions.e_linearized, "%PDF-1.5");
sdfDoc.Dispose();
And this is my delete implementation:
var filedelete = Task.Run(() => File.Delete(filePath));
The creation of the file is running on a seperate Task and the deletion takes place upon a button press.
I understand the nature of the exception, although I was wondering if the resources of the file are returned to the system from PDFTron after the creation of the file?
Any help or direction would be much appreciated.
Thank you.
Upvotes: 1
Views: 860
Reputation: 2570
PDFNet uses reference counting internally to know when to release the filesystem handles and memory.
For example, the following would trigger the issue where the file is still locked.
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.
But this would work as expected.
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
Note the using
statement for the PDFDoc instance, and the manual dispose of the SDFDoc instance, though you could use a using
statement on that also.
Upvotes: 0