进程无法访问另一进程正在使用的文件c#

进程无法访问另一进程正在使用的文件c#,c#,filestream,C#,Filestream,我正在使用SaveFileDialog保存pdf文件。但是在创建pdf文件时,我遇到了这个错误 The process cannot access the file it is being used by another process c# 这是我的c代码 我在这一行遇到了这个错误 using (FileStream file = new FileStream(saveFileDialog1.FileName, FileMode.Create, System.IO.FileAccess.Wr

我正在使用SaveFileDialog保存pdf文件。但是在创建pdf文件时,我遇到了这个错误

The process cannot access the file it is being used by another process c#
这是我的c代码

我在这一行遇到了这个错误

using (FileStream file = new FileStream(saveFileDialog1.FileName, FileMode.Create, System.IO.FileAccess.Write, FileShare.ReadWrite))
这是我的pdf文件代码

        Stream myStream;

        Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f);

        using (MemoryStream stream = new MemoryStream())
        {
            pdfDoc.Open();
            pieChart.SaveImage(stream, ChartImageFormat.Png);
            iTextSharp.text.Image chartImage = iTextSharp.text.Image.GetInstance(stream.GetBuffer());
            chartImage.ScalePercent(75f);
            pdfDoc.Add(chartImage);
        }
        pdfDoc.Close();
请帮帮我。 提前谢谢

if ((myStream = saveFileDialog1.OpenFile()) != null)
在此处打开文件,然后尝试创建它:

new FileStream(saveFileDialog1.FileName, FileMode.Create, System.IO.FileAccess.Write, FileShare.ReadWrite)
myStream是否在
GetInstance()方法中关闭
事实并非如此。否则,您无法使用块从内部读取:

myStream.Read(bytes, 0, (int)myStream.Length);
您应该读取文件的所有内容,关闭流,然后重新创建文件。
另一种方法是使用临时文件复制其内容

逐行:

if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
    // open the file to read its contents
    if ((myStream = saveFileDialog1.OpenFile()) != null)
    {
        // create NEW PDF object in memory
        Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f);

        // use memory stream for image
        using (MemoryStream stream = new MemoryStream())
        {
            // open pdf for changes
            pdfDoc.Open();
            // write image to memory stream
            pieChart.SaveImage(stream, ChartImageFormat.Png);
            // create image instance from memory stream
            iTextSharp.text.Image chartImage = iTextSharp.text.Image.GetInstance(stream.GetBuffer());
            chartImage.ScalePercent(75f);
            // add the image to pdf document
            pdfDoc.Add(chartImage);
        }
        // close document... and forget about it. all changes were made in memory
        // pdfDoc will be collected by GC.
        pdfDoc.Close();

        // try to create new file with the name as already opened by myStream - Exception here
        using (FileStream file = new FileStream(saveFileDialog1.FileName, FileMode.Create, System.IO.FileAccess.Write, FileShare.ReadWrite))
        {
            byte[] bytes = new byte[myStream.Length];
            myStream.Read(bytes, 0, (int)myStream.Length);
            file.Write(bytes, 0, bytes.Length);
            myStream.Close();
        }
    }
}
你真正应该做的是:

  • 加载PDF文件。(
    Document
    可能包含静态方法
    Load
    /
    LoadFrom
    或类似的内容。
  • 像在get实例中一样更改PDF。
  • 可以随意保存到文件。(
    saveFileDialog1.FileName

您正在写入正在读取的同一文件。因此会显示错误消息。

因为在实例化
文件流时,您的
(myStream=saveFileDialog1.OpenFile())
已经有一个打开该文件的句柄


你应该使用一个
StreamWriter
来完成这项任务,而不是混同于多个流。

你打开了pdf吗?@user1714556没有关闭。我已经用pdf文件代码更新了我的帖子。请帮我提建议that@RammyStream未关闭。它持有文件的句柄。打开的文件。myStream未关闭,但当您使用FileMode.Create调用new FileStream()时,您正在尝试创建与myStream正在读取的文件同名的文件。关闭myStream的方式和位置让我们首先定义目标。您想修改PDF,是吗?然后您应该1)从文件中读取数据,2)更改它3)写回。您可以在内存中创建PDF,向其中添加图像,然后关闭。您不会将其保存到磁盘或内存中的字节流中。据我所知,GetInstance实际上对文件不做任何处理。PDF api应该包含类似“SaveToFile()”的方法是的,先生完全相同,我希望PDF与SaveFileDialog对话框一起保存,该对话框正在避免此错误。。
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
    // open the file to read its contents
    if ((myStream = saveFileDialog1.OpenFile()) != null)
    {
        // create NEW PDF object in memory
        Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f);

        // use memory stream for image
        using (MemoryStream stream = new MemoryStream())
        {
            // open pdf for changes
            pdfDoc.Open();
            // write image to memory stream
            pieChart.SaveImage(stream, ChartImageFormat.Png);
            // create image instance from memory stream
            iTextSharp.text.Image chartImage = iTextSharp.text.Image.GetInstance(stream.GetBuffer());
            chartImage.ScalePercent(75f);
            // add the image to pdf document
            pdfDoc.Add(chartImage);
        }
        // close document... and forget about it. all changes were made in memory
        // pdfDoc will be collected by GC.
        pdfDoc.Close();

        // try to create new file with the name as already opened by myStream - Exception here
        using (FileStream file = new FileStream(saveFileDialog1.FileName, FileMode.Create, System.IO.FileAccess.Write, FileShare.ReadWrite))
        {
            byte[] bytes = new byte[myStream.Length];
            myStream.Read(bytes, 0, (int)myStream.Length);
            file.Write(bytes, 0, bytes.Length);
            myStream.Close();
        }
    }
}