C# 由于IOException,无法删除该文件。它';正在被另一个进程使用
在尝试删除文件时,我一直遇到上述错误。请参阅代码注释以确切了解错误发生的位置C# 由于IOException,无法删除该文件。它';正在被另一个进程使用,c#,using,ioexception,C#,Using,Ioexception,在尝试删除文件时,我一直遇到上述错误。请参阅代码注释以确切了解错误发生的位置 foreach (string file in supportedFiles) { if (file.EndsWith(".pdf")) { PDFImageExtractor.ExtractImagesFromPDF( file, AppVars.TempFolder, Path.GetFileNameWith
foreach (string file in supportedFiles)
{
if (file.EndsWith(".pdf"))
{
PDFImageExtractor.ExtractImagesFromPDF(
file,
AppVars.TempFolder,
Path.GetFileNameWithoutExtension(file));
}
}
foreach (string file in supportedFiles)
{
if (file.EndsWith(".pdf"))
{
// I get the error here.
File.Delete(file);
}
}
以下是发生错误之前的代码,在PDFImageExtractor.ExtractImagesFromPDF方法中:
public static void ExtractImagesFromPDF(
string sourcePdf,
string outputPath,
string fileName)
{
// NOTE: This will only get the first image it finds per page.
PdfReader pdf = new PdfReader(sourcePdf);
RandomAccessFileOrArray raf =
new iTextSharp.text.pdf.RandomAccessFileOrArray(sourcePdf);
try
{
for (int pageNumber = 1; pageNumber <= pdf.NumberOfPages; pageNumber++)
{
PdfDictionary pg = pdf.GetPageN(pageNumber);
PdfDictionary res = (PdfDictionary)PdfReader.GetPdfObject(pg.Get(PdfName.RESOURCES));
PdfDictionary xobj = (PdfDictionary)PdfReader.GetPdfObject(res.Get(PdfName.XOBJECT));
if (xobj != null)
{
foreach (PdfName name in xobj.Keys)
{
PdfObject obj = xobj.Get(name);
if (obj.IsIndirect())
{
PdfDictionary tg = (PdfDictionary)PdfReader.GetPdfObject(obj);
PdfName type =
(PdfName)PdfReader.GetPdfObject(tg.Get(PdfName.SUBTYPE));
if (PdfName.IMAGE.Equals(type))
{
int XrefIndex = Convert.ToInt32(((PRIndirectReference)obj).Number.ToString(CultureInfo.InvariantCulture));
PdfObject pdfObj = pdf.GetPdfObject(XrefIndex);
PdfStream pdfStrem = (PdfStream)pdfObj;
byte[] bytes = PdfReader.GetStreamBytesRaw((PRStream)pdfStrem);
if ((bytes != null))
{
using (MemoryStream memStream = new MemoryStream(bytes))
{
memStream.Position = 0;
System.Drawing.Image img = System.Drawing.Image.FromStream(memStream);
// must save the file while stream is open.
if (!Directory.Exists(outputPath))
Directory.CreateDirectory(outputPath);
string path = Path.Combine(outputPath, String.Format(@"{0}.jpg", fileName));
using (EncoderParameters parms = new EncoderParameters(1))
{
parms.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Compression, 0);
// GetImageEncoder is found below this method
ImageCodecInfo jpegEncoder = GetImageEncoder("JPEG");
img.Save(path, jpegEncoder, parms);
}
//EncoderParameters parms = new EncoderParameters(1);
break;
}
}
}
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
pdf.Close();
}
}
public static ImageCodecInfo GetImageEncoder(string imageType)
{
imageType = imageType.ToUpperInvariant();
foreach (ImageCodecInfo info in ImageCodecInfo.GetImageEncoders())
{
if (info.FormatDescription == imageType)
{
return info;
}
}
return null;
}
publicstaticvoid-ExtractImagesFromPDF(
字符串源PDF,
字符串输出路径,
字符串(文件名)
{
//注意:这将仅获取每页找到的第一个图像。
PdfReader pdf=新PdfReader(sourcePdf);
随机存取文件或阵列raf=
新的iTextSharp.text.pdf.RandomAccessFileOrArray(sourcePdf);
尝试
{
对于(int pageNumber=1;pageNumber我认为您的:
System.Drawing.Image img = System.Drawing.Image.FromStream(memStream);
正在丢失一个正在使用的文件
PdfReader或RandomAccessFileOrray是否实现IDisposable
可能很愚蠢,但使用Process Explorer查看是否还有其他文件可以处理这些文件是值得的。我认为您的:
System.Drawing.Image img = System.Drawing.Image.FromStream(memStream);
正在丢失一个正在使用的文件
PdfReader或RandomAccessFileOrray是否实现IDisposable
可能很傻,但使用Process Explorer查看是否还有其他文件有句柄是值得的。未使用且未关闭“raf”变量。它正在锁定文件
RandomAccessFileOrArray raf =
new iTextSharp.text.pdf.RandomAccessFileOrArray(sourcePdf);
“raf”变量未使用且未关闭。它正在锁定文件
RandomAccessFileOrArray raf =
new iTextSharp.text.pdf.RandomAccessFileOrArray(sourcePdf);
你为什么需要iTextSharp.text.pdf.randomAccessFileOrray(raf)?也许你需要关闭它?就是这样。你这个男人!你为什么需要iTextSharp.text.pdf.randomAccessFileOrray(raf)?也许你需要关闭它?就是这样。你爸爸!刚刚添加了使用。我想可能是吧。他们没有实现IDisposaClear对PDF库的调用绝对是同步的?如果你不确定,你可以在文件前放一个强力线程。Sleep(60000)或其他东西。删除调用只是为了检查。现在再看一看。:)谢谢大家,但阿米拉姆·科拉赫找到了答案。我需要关闭iTextSharp.text.pdf.RandomAccessFileOrArray(raf)。:)试着在你的finally中放一个raf.close()(抱歉,这只是浏览了一些iText文档)刚刚添加了使用。我想可能是吧。他们没有实现idisposableAre对PDF库的调用绝对是同步的?如果你不确定,你可以使用蛮力线程。Sleep(60000)或者在你的文件之前。删除通话只是为了检查。现在再看一看。:)谢谢大家,但阿米拉姆·科拉赫已经搞定了。我需要关闭iTextSharp.text.pdf.RandomAccessFileOrArray(raf)。:)试着在你的finally中放一个raf.close()。(抱歉,这只是浏览了一些iText文档)