1
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) を使用して手動で開こうとしたとき

それがスローされ、ファイルの例外が別のプロセスによって使用されています。何をすべきか教えてください。

私はすでに FileShare.ReadWrite 属性と File.OpenRead(path) をコードで使用していますが、うまくいきません。

4

2 に答える 2

0

破棄する必要があるストリーム オブジェクトをリークしています。具体的には、ここで2 番目のパラメーターとして渡されるもの:

pd4ml.render(stream,new System.IO.FileStream(FileName, System.IO.FileMode.CreateNew));

そのメソッド呼び出しの一部として新しいストリームを作成するのではなく、それを別の変数に配置する必要があります(手動ではなく、ステートメント for it および for をDispose使用することをお勧めします)。usingstream

using(var stream2 = new System.IO.FileStream(FileName, System.IO.FileMode.CreateNew))
{
  pd4ml.render(stream,stream2);
}
于 2016-05-26T07:33:30.210 に答える
0

あなたの問題は、ファイルを参照して好きなことをできるようにすることですFile.Createhttp://msdn.microsoft.com/en-us/library/d62kzs03.aspxstream

したがって、技術的にはすでに使用されています。

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を参照

于 2016-05-26T06:20:17.547 に答える