C#删除文件"类型' System.IO.IOException'的第一次机会异常。发生在mscorlib.dll"

时间:2017-03-03 07:31:23

标签: c# image pdf delete-file pdfsharp

我试图将部分表单的图片添加到PDF中,因此我使用的是PDFsharp,但我遇到的一个问题是我无法删除图片后已将其添加到PDF文件中。

这是我使用的代码:

private void button12_Click(object sender, EventArgs e)
{
    string path = @"c:\\Temp.jpeg";
    Bitmap bmp = new Bitmap(314, this.Height);
    this.DrawToBitmap(bmp, new Rectangle(Point.Empty, bmp.Size));
    bmp.Save(path, System.Drawing.Imaging.ImageFormat.Jpeg);

    GeneratePDF("test.pdf",path);
    var filestream = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite);
    filestream.Close();
    if (File.Exists(path))
    {
        File.Delete(path);
    }
}

private void GeneratePDF(string filename, string imageLoc)
{
    PdfDocument document = new PdfDocument();

    // Create an empty page or load existing
    PdfPage page = document.AddPage();

    // Get an XGraphics object for drawing
    XGraphics gfx = XGraphics.FromPdfPage(page);
    DrawImage(gfx, imageLoc, 50, 50, 250, 250);

    // Save and start View
    document.Save(filename);
    Process.Start(filename);
}

void DrawImage(XGraphics gfx, string jpegSamplePath, int x, int y, int width, int height)
{
    XImage image = XImage.FromFile(jpegSamplePath);
    gfx.DrawImage(image, x, y, width, height);
}

FileStream就在那里,因为我试图确保它已关闭,如果那是问题。 这是我获得用于将图片写入PDF overlay-image-onto-pdf-using-pdfsharp的代码的地方,这是我获取代码以生成capture-a-form-to-image

形式的图片的地方

我是否错过了一些明显的东西? 或者有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

如果您阅读System.IO.IOException的详细信息,则会告诉您

  

无法访问该文件,因为它被另一个进程使用。

仍在使用你的图像的过程是这个不错的对象:

XImage image = XImage.FromFile(jpegSamplePath);

解决方案是在将图像绘制到PDF后处理图像:

void DrawImage(XGraphics gfx, string jpegSamplePath, int x, int y, int width, int height)
{
    XImage image = XImage.FromFile(jpegSamplePath);
    gfx.DrawImage(image, x, y, width, height);

    image.Dispose();
}

现在,Exception消失得无影无踪......你的档案也是......

修改

更优雅的解决方案是使用using块,这将确保在您完成文件后调用Dispose()

void DrawImage(XGraphics gfx, string jpegSamplePath, int x, int y, int width, int height)
{
    using (XImage image = XImage.FromFile(jpegSamplePath))
    {
        gfx.DrawImage(image, x, y, width, height);
    }
}

答案 1 :(得分:0)

回答第二个问题“或者有更好的方法吗?”

使用MemoryStream而不是文件可解决此问题。它会提高性能。解决方法很糟糕,但性能改进很好。

可以将MemoryStream作为参数传递。这比拥有固定文件名更清晰。是否在程序中传递文件名或MemoryStream没有实际区别。