Не удается получить доступ к файлу, поскольку он используется другим процессом

Мой веб-метод создает файл 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, проблема та же.

Мы будем очень признательны за любое понимание.

РЕДАКТИРОВАТЬ: В настоящее время я "кодирую" проблему, но не нашел решения.


person Wim Ombelets    schedule 25.03.2013    source источник
comment
Вы уверены, что файл не используется до того, как программа чтения PDF откроет его? (как и в том, что вы делаете с этим файлом до этого)   -  person Sayse    schedule 25.03.2013
comment
а еще лучше попробуйте поменять порядок открытия файлов (filestream до pdf reader)   -  person Sayse    schedule 25.03.2013


Ответы (4)


Ваша проблема в том, что вы пишете в файл, одновременно читая из него. В отличие от некоторых типов файлов (JPG, PNG и т. д.), которые загружают все данные в память, iTextSharp считывает данные как поток. Вам либо нужно использовать два файла и поменять их местами в конце, либо вы можете заставить iTextSharp загрузить первый файл, привязав ваш PdfReader к массиву байтов файла.

PdfReader reader = new PdfReader(System.IO.File.ReadAllBytes(filePath));
person Chris Haas    schedule 26.03.2013
comment
Я искал это решение в течение нескольких часов. Работает отлично! - person Baxter; 19.10.2013

Я предлагаю вам использовать FileShare enumerator при открытии файла, поэтому попробуйте открыть файл с помощью None sharing

   File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None);
person Aghilas Yakoub    schedule 25.03.2013

Попробуйте .Dispose() вашего PDF-ридера (или того, что вы используете для его создания) при первом сохранении файла.

person Donatas K.    schedule 25.03.2013
comment
Это вне моей досягаемости. Веб-служба вызывает DLL ActiveX, которая принимает путь к файлу. Первая операция записи находится вне моего контроля. - person Wim Ombelets; 25.03.2013

Попробуйте это решение, если считаете, что это возможно для вас. После того, как веб-метод создаст файл в папке Temp, вам нужно скопировать файл и вставить его в другое место или в то же место с другим именем и передать только что скопированный путь к файлу в программу чтения PDF.

person Lingaraj    schedule 25.03.2013
comment
Да, но это не объясняет причину этой проблемы - person Wim Ombelets; 26.03.2013