2016-06-02 10 views
0

でRAW形式に戻った後、一時ファイルを削除しますか?私はストリームを使用して、生の形式で動作WCFサービスを持っているWCF

私はfinallyブロックを使用しようとしましたが、それは右return後に呼び出されると、ファイルがまだプロセスによって使用されているため、例外がスローされます。

もちろん、これはバックグラウンドワーカーがファイルを削除できるようにするのを待っているような回避策ですが、私の意見ではWebサービスの実装方法とは異なります。

+2

あなたが最初の場所にあるファイルを使用して避けることができない:

MemoryStream ms = new MemoryStream(); using (FileStream fs = File.OpenRead(signedFileName)) { //Read from fs and write to ms } 

は、その後、あなたが行う必要がありますすべてのファイルを削除して、ms返す呼び出しですか?代わりに(メモリ内で)ストリームを使用していますか? –

+0

@ Christian.K残念なことに、 'XmlDocumentSigner'は非常に特定のアルゴリズム(管理されたファイルベースの代替ライブラリもファイルベースのライブラリもありません)を使用する外部アンマネージDLLライブラリのラッパーであり、ファイルにしか署名できません:( –

答えて

1

解決策はすばやく心に浮かんできました。それは絶対的に論理的です。ファイルコンテンツをメモリに読み込んでファイルを削除するだけです。

public Stream SignDocument(Stream requestStream) 
{ 
    string originalFileName = Path.GetTempFileName(); 
    string signedFileName = Path.GetTempFileName(); 

    using (var originalFileStream = File.Open(originalFileName, FileMode.Create, FileAccess.Write)) 
    { 
     requestStream.CopyTo(originalFileStream); 
    } 

    XmlDocumentSigner.SignFile(originalFileName, signedFileName); 

    byte[] signedFileBytes = File.ReadAllBytes(signedFileName); 
    File.Delete(signedFileName); 
    return new MemoryStream(signedFileBytes); 
} 

using文は、このコードが同様に失敗しますことを注意:

using (var ms = new MemoryStream(signedFileBytes)) 
{ 
    return ms; 
} 
+1

あなたはあなたの回答を見つけることにしました。あなたも複雑ではありませんでした! – TheLethalCoder

+0

@TheLethalCoderありがとう:) –

+0

こちらも参照してください:https://devdump.wordpress.com/2008/12/07/disposing-return-values/。彼らは処分について話しますが、あなたはOperationCompletedに加入してそこのファイルを削除することができます。ファイル全体をメモリにコピーするよりも優れています。 – Evk

1

を私はそれを試していないが、あなたはファイルを開き、別のストリームにそのストリームを書くことができます。ような何か:

File.Delete(signedFileName); 
return ms; 
関連する問題