Не удается получить доступ к файлу, потому что он используется другим процессом
Мой веб-метод создает файл PDF в моей папке%temp%, и это работает. Затем я хочу добавить некоторые пользовательские поля (мета) в этот файл, используя код ниже.
Класс PdfStamper
генерирует IOException
Я использую его .Close()
метод или using
Блок просто заканчивается. Процесс, который все еще держится за дескриптор файла, - это сам веб-сервер webdev (я отлаживаю в VS2010 SP1).
private string AddCustomMetaData(string guid, int companyID, string filePath)
{
try
{
PdfReader reader = new PdfReader(filePath);
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
{
PdfStamper st = new PdfStamper(reader, fs);
Dictionary<string, string> info = reader.Info;
info.Add("Guid", guid);
info.Add("CompanyID", companyID.ToString());
st.MoreInfo = info;
st.Close();
}
reader.Close();
return guid;
}
catch (Exception e)
{
return e.Message;
}
}
Независимо от того, что я пытаюсь, он выдает исключение в st.Close();
, чтобы быть более точным:
Процесс не может получить доступ к файлу "C:\Users[мое имя пользователя]\AppData\Local\Temp\53b96eaf-74a6-49d7-a715-6c2e866a63c3.pdf", так как он используется другим процессом.
Либо я пропускаю что-то очевидное, либо есть проблема с PdfStamper
класс, о котором я еще не знаю. Используются версии itextsharp 5.3.3.0 и 5.4.0.0, проблема та же.
Любое понимание будет с благодарностью.
РЕДАКТИРОВАТЬ: Я в настоящее время "кодирую" проблему, но я не нашел никакого решения.
4 ответа
Ваша проблема в том, что вы пишете в файл, а также читаете из него. В отличие от некоторых типов файлов (JPG, PNG и т. Д.), Которые "загружают" все данные в память, iTextSharp считывает данные в виде потока. Вам нужно либо использовать два файла и поменять их местами в конце, либо вы можете заставить iTextSharp "загрузить" первый файл, привязав ваш PdfReader
в байтовый массив файла.
PdfReader reader = new PdfReader(System.IO.File.ReadAllBytes(filePath));
Я предлагаю вам использовать FileShare enumerator
когда вы открываете файл, поэтому попробуйте открыть файл с None sharing
File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None);
Попробуйте.Dispose() ваш PDF Reader (или все, что вы используете для его создания), когда вы сохраняете файл в первый раз
Попробуйте это решение, если считаете, что оно выполнимо для вас - как только веб-метод создает файл в папке Temp, вам необходимо скопировать файл и вставить его в другое место или в то же место с другим именем и передать путь к вновь скопированному файлу в программу чтения PDF.