1

.Net アプリケーションで NVelocity テンプレートを使用しようとしています: テンプレートを使用して結果をファイルに出力します。出力が完全に上書きされないという事実を除いて、すべて正常に動作しているようです。ファイルの長さが 100 文字で、テンプレートが 20 文字しかレンダリングしない場合、最後の 80 文字は決して変更されません!

コードサンプル:

        FileStream fileStream = new FileStream(outputPath, FileMode.OpenOrCreate, FileAccess.Write);

        using (StreamWriter streamWriter = new StreamWriter(fileStream))
        {
            velocityEngine.MergeTemplate(templateName, Encoding.Default.WebName, velocityContext, streamWriter);
        }

したがって、テンプレートが AAAA を出力し、ファイルに既に BBBBBBBB が含まれている場合、最後に、ファイルには op の最後に AAAABBBB が含まれます。

ファイルを完全に上書きする方法の手がかりはありますか? - たとえば、上記の例では、最終的な出力は AAAA である必要があります。これが純粋なストリーム関連のものかどうかはよくわかりませんが、ファイルストリームでこの問題が発生したことはありません。

リセットメソッドを書くか、単にメモリストリームに出力してファイルを上書きするだけで満足ですが、可能であればこのように動作させたいです! **編集:'' を呼び出すことで動作するようになりました

 fileStream.SetLength(0);

ファイルを開くとき。しかし、もっと良い方法があれば教えていただければ幸いです。

4

2 に答える 2

2

FileMode.OpenOrCreate解決策は、単にFileMode.Create最初の行でto を変更することだと思います

System.IO.FileModeに関する MSDN の記事から..

FileMode.Create オペレーティング システムが新しいファイルを作成する必要があることを指定します。ファイルが既に存在する場合は、上書きされます。

FileMode.OpenOrCreate ファイルが存在する場合、オペレーティング システムがファイルを開く必要があることを指定します。それ以外の場合は、新しいファイルを作成する必要があります。

于 2009-01-09T12:56:51.627 に答える
0

オープン時にファイルを切り捨てている可能性があることがわからない場合は、StreamのSetLengthメソッドを使用してファイルを切り捨てることができます。
http://msdn.microsoft.com/en-us/library/system.io.stream.setlength.aspx

これが機能するためには、ストリームが書き込み可能でシーク可能である必要があります。

于 2009-02-20T08:08:49.460 に答える