Ne peut pas accéder au fichier car ce fichier est utilisé par un autre processus
Ma méthode web crée un fichier pdf dans mon dossier %temp% et qui fonctionne. Ensuite, je tiens à ajouter quelques champs personnalisés (meta) de ce fichier à l'aide du code ci-dessous.
La classe PdfStamper
génère un IOException
, si je utiliser sa .Close()
méthode ou la using
bloc se termine juste. Le processus qui maintient encore sur pour le descripteur de fichier est l'webdev serveur web lui-même (je suis de débogage dans 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;
}
}
Peu importe ce que j'essaie, elle continue de jeter de l'exception à st.Close();
, pour être plus précis:
Le processus ne peut pas accéder au fichier 'C:\Users[mon
nom d'utilisateur]\AppData\Local\Temp\53b96eaf-74a6-49d7-a715-6c2e866a63c3.pdf"
car il est utilisé par un autre processus.
Soit je suis donnant sur quelque chose d'évident ou il y a un problème avec le PdfStamper
classe je suis encore pas au courant de. Les Versions de itextsharp utilisés sont 5.3.3.0 et 5.4.0.0, le problème est le même.
Toute réflexion serait grandement apprécié.
EDIT: je suis en train de "codage autour de" la question, mais je n'ai pas trouvé de solution.
- êtes-vous sûr que le fichier n'est pas utilisé, avant de le pdf reader s'ouvre il? (comme dans ce que vous faites avec ce fichier avant cela)
- mieux encore, essayez de changer l'ordre de vos ouverture de fichier (
filestream
avantpdf reader
)
Vous devez vous connecter pour publier un commentaire.
Vous êtes le problème, c'est que vous écrivez dans un fichier pendant que vous êtes également le lire. Contrairement à certains types de fichiers (JPG, PNG, etc) qui "charge" toutes les données en mémoire, iTextSharp lit les données sous forme d'un flux. Vous devez utiliser deux fichiers et de les échanger à la fin ou vous pouvez forcer iTextSharp pour "charger" le premier fichier par la liaison de votre
PdfReader
à un tableau d'octets du fichier.Je vous suggérons d'utiliser le
FileShare enumerator
lorsque vous ouvrez le fichier, donc Essayez d'ouvrir un fichier avecNone sharing
Essayer .Dispose() de votre lecteur de fichier PDF (ou ce que vous utilisez pour cela la création) lorsque vous enregistrez le fichier pour la première fois
D'essayer cette solution si vous pensez que c'est faisable pour vous - une Fois le webmethod crée un fichier dans le dossier Temp, vous devrez copier le fichier et de le coller dans un autre emplacement ou même endroit avec des noms différents et passer nouvellement copié le fichier chemin d'accès à votre lecteur de PDF.