c# — PDF-файл, используемый другой ошибкой процесса в Bitmiracle.Docotic.Pdf
Я пытаюсь изменить метаданные PDF-файла, используяBitmiracle.Docotic.Pdf
. Следующий пример я взял со страницы BitMiracle на Github.Metadata.pdf
— это существующий PDF-документ на моем компьютере.
string pathToFile = "Metadata.pdf";
using (PdfDocument pdf = new PdfDocument(pathToFile))
{
pdf.Info.Author = "Sample Browser application";
pdf.Info.Subject = "Document metadata";
pdf.Info.Title = "Custom title goes here";
pdf.Info.Keywords = "pdf, Docotic.Pdf";
pdf.Save(pathToFile);
}
Я получаю такую ошибку:
System.IO.IOException: процесс не может получить доступ к файлу «Metadata.pdf», поскольку он используется другим процессом.
Как я могу это решить?
2 ответа
Файл заблокирован экземпляром PdfDocument. Вместо этого сохраните их во временный файл или поток и скопируйте временные данные в исходное место после удаления PdfDocument. Образец кода:
string tempFile = ...;
using (var pdf = new PdfDocument(pathToFile))
{
...
pdf.Save(tempFile);
}
File.Copy(tempFile, originalFileName, true);
Похоже, что другой процесс использует файл и он «заблокирован». Хотя несколько процессов могут получить доступ к файлу в режиме только для чтения, только один может получить доступ к нему в режиме чтения и записи (при этом файл блокируется).
Первым шагом будет выяснение того, какие процессы используют этот файл. Его можно открыть в фоновом режиме Acrobat Reader или даже с помощью Explorer.
Полезный инструмент, который я использую, от Microsoft, который проверяет и может выпускать файлы, называетсяFile Locksmith
в ихPowerToys
коммунальные услуги. С его помощью вы можете проверить, открыт ли файл каким-либо другим процессом, кроме вашего кода, и завершить этот процесс, чтобы освободить файл.
https://learn.microsoft.com/en-us/windows/powertoys/file-locksmith
Вы можете получить PowerToys здесь: https://learn.microsoft.com/en-us/windows/powertoys/
Если единственным процессом, использующим файл, является ваш код, это означает, что в коде что-то не так, но поскольку вы сказали, что скопировали из примера на странице документации, маловероятно, что это так.