2017-09-29 3 views
1

Ich versuche, PDF-Datei mit PDFTron in Anwendung, die in der UWP-Umgebung läuft erstellen. Ich kann eine Datei erfolgreich erstellen. Je nach Benutzereingabe muss die neu erstellte Datei möglicherweise umbenannt oder vollständig aus dem System gelöscht werden. Obwohl, wenn ich versuche, die Datei zuzugreifen, die nur das System erstellt wurden, wirft die folgende Ausnahme:Erstellen Sie eine PDF-Datei mit PDFTron und dann umbenennen oder löschen

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. 

Den folgenden Teil zeigen, was für die Datei verwendet wird, erstellt werden:

await sdfDoc.SaveAsync(filePath, SDFDocSaveOptions.e_linearized, "%PDF-1.5"); 
sdfDoc.Dispose(); 

Und das ist meine löschen Umsetzung:

var filedelete = Task.Run(() => File.Delete(filePath)); 

die Erstellung der Datei auf einem separaten Task läuft und die Löschung erfolgt auf Tastendruck.

Ich verstehe die Art der Ausnahme, obwohl ich mich fragte, ob die Ressourcen der Datei von PDFTron nach der Erstellung der Datei an das System zurückgegeben werden?

Jede Hilfe oder Richtung würde sehr geschätzt werden.

Vielen Dank.

+0

1) Können Sie zeigen, wie Sie das PDFDoc-Objekt instanziieren? Übergeben Sie eine StorageFile? 2) Welcher Dateityp ist filePath in Ihrem Aufruf von SaveAsync? 3) Wird das PDFDoc-Objekt zur Anzeige an PDFViewCtrl übergeben? 4) Warum ist das Umbenennen/Löschen einer Datei wichtig für Sie? – Ryan

+0

Vielen Dank für die Antwort Ryan: 1) Für die Instantiierung verwende ich - PDFDoc pdfdoc = new PDFDoc(); und SDFDoc sdfDoc = pdfdoc.GetSDFDoc(); 2) Ich verwende keine Speicherdatei für den Zugriff auf die Datei, nur den filePath, der eine Zeichenfolge ist, die auf den Pfad verweist, in dem die Datei derzeit gespeichert ist. Diese Zeichenfolge wird als Parameter an SaveAsync übergeben. 3) Die erstellte PDF wird nicht an die PDFViewCtrl übergeben. 4) Der Benutzer definiert den Dateinamen der erstellten PDF und sie müssen im Fehlerfall möglicherweise umbenannt oder gelöscht werden. – Illusioner

+0

Da Sie eine Zeichenfolge übergeben, ist der Dateipfad im App-eigenen Speicher? Außerdem können Sie die Ausgabe von PDFNet.GetVersion zur Laufzeit veröffentlichen. – Ryan

Antwort

0

PDFNet verwendet das interne Referenzzählen, um zu wissen, wann die Dateisystemzugriffe und der Speicher freigegeben werden sollen.

Zum Beispiel würde das Folgende das Problem auslösen, wo die Datei noch gesperrt ist.

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. 

Aber dies würde wie erwartet funktionieren.

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 

Notiere die using-Anweisung für die PDFDoc Instanz, und die manuelle dispose der SDFDoc Instanz, wenn Sie auch eine using Aussage über das nutzen könnten.

Verwandte Themen