Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot access the file because it is being used by another process

My web method creates a pdf file in my %temp% folder and that works. I then want to add some custom fields (meta) to that file using the code below.

The class PdfStamper generates an IOException, whether I use its .Close() method or the using block just ends. The process that is still holding on to the file handle is the webdev web server itself (I'm debugging in 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;
    }
}

No matter what I try, it keeps throwing the exception at st.Close();, to be more precise:

The process cannot access the file 'C:\Users[my username]\AppData\Local\Temp\53b96eaf-74a6-49d7-a715-6c2e866a63c3.pdf' because it is being used by another process.

Either I'm overlooking something obvious or there's a problem with the PdfStamper class I'm as of yet unaware of. Versions of itextsharp used are 5.3.3.0 and 5.4.0.0, the issue is the same.

Any insight would be greatly appreciated.

EDIT: I'm currently "coding around" the issue, but I haven't found any solution.

like image 751
Wim Ombelets Avatar asked Mar 25 '13 14:03

Wim Ombelets


People also ask

What does it mean when a file is being used by another process?

This error usually means that either the user or someone else still has that file open. This can happen if the file referenced is open in another program or if a crash occurs while uploading.

How do you close a file that is used by another process?

Using Windows Resource Monitor Type the name of the file you're trying to close in the Search Handles bar, and then click the magnifying glass icon. Locate the program using your file. Right-click the program using the file in question and select End Process.


1 Answers

Your problem is that you are writing to a file while you are also reading from it. Unlike some file types (JPG, PNG, etc) that "load" all of the data into memory, iTextSharp reads the data as a stream. You either need to use two files and swap them at the end or you can force iTextSharp to "load" the first file by binding your PdfReader to a byte array of the file.

PdfReader reader = new PdfReader(System.IO.File.ReadAllBytes(filePath));
like image 192
Chris Haas Avatar answered Sep 17 '22 03:09

Chris Haas