进程无法访问另一进程正在使用的文件c#
我正在使用SaveFileDialog保存pdf文件。但是在创建pdf文件时,我遇到了这个错误进程无法访问另一进程正在使用的文件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
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();
}
}
}