PD4ML pd4ml = new PD4ML();
pd4ml.enableTableBreaks(true);
pd4ml.PageInsets = new System.Drawing.Rectangle(5, 5, 5, 5);
pd4ml.PageSize = PD4Constants.getSizeByName("LETTER");
Byte[] byteArray = Encoding.ASCII.GetBytes(content);
MemoryStream stream = new MemoryStream(byteArray);
FinalPath = FinalPath + @"\" + VersionID;
if (!Directory.Exists(FinalPath))
Directory.CreateDirectory(FinalPath);
string FileName = FinalPath +FileName+ ".pdf";
pd4ml.render(stream,new System.IO.FileStream(FileName, System.IO.FileMode.CreateNew));
stream.Flush();
stream.Close();
stream.Dispose();
//In another method I'm opening this file
File stream fs = File.Open(path, FileMode.Open, FileAccess.Read);`
我正在使用pd4ml.render()方法生成PDF。当我使用render方法创建此文件时,它会在系统内部的某处打开。这就是为什么当我尝试使用Filestream fs = new Filestream(path,FileMode.Open,FileAccess.Read)进行mannualy打开它时
它抛出并且另一个进程正在使用文件异常。请指导我做什么。
我已经在我的代码中使用了FileShare.ReadWrite属性和File.OpenRead(path),但它对我不起作用。
答案 0 :(得分:0)
您的问题是File.Create
会打开一个stream
,允许您按照自己喜欢的方式参考文件:http://msdn.microsoft.com/en-us/library/d62kzs03.aspx
因此,从技术上讲,它已经在使用中。
完全删除File.Create
。如果文件不存在,StreamWriter将处理创建文件。
使用流时,最好先做
using (Stream s = new Stream())
{
} // Stream closes here
If you also create the output stream, make sure to close it.
参考http://www.codeproject.com/Questions/1097511/Can-not-opening-pdfs-generated-using-pd-ml-using-C
答案 1 :(得分:0)
您正在泄漏应该处理的流对象。具体来说,这里作为第二个参数传递的那个:
pd4ml.render(stream,new System.IO.FileStream(FileName, System.IO.FileMode.CreateNew));
不是将新流作为该方法调用的一部分创建,而是应该将其放在另一个变量Dispose
中(最好使用using
语句和stream
语句。 ,而不是手动)。
using(var stream2 = new System.IO.FileStream(FileName, System.IO.FileMode.CreateNew))
{
pd4ml.render(stream,stream2);
}