1

C#.Net アプリケーションからの出力を定期的に読み取るサード パーティ アプリケーションがあります。
特定の制約により、サードパーティのアプリケーションによって読み取られるファイルにのみ出力を書き込むことができます。

毎回同じファイルの内容を上書きする必要があります。
私は現在、C#でそれを行っています

Loop
{
  //do some work
  File.WriteAllText(path,Text);
}

サードパーティのアプリケーションは定期的にファイルをチェックし、内容を読み取ります。これはうまく機能しますが、CPU 使用率が非常に高くなります。File.WriteAllText をテキスト ライターに置き換えると、CPU 使用率が高くなる問題は解決しますが、ファイルを上書きするのではなく、テキストがファイルに追加されます。

C# でファイルを開いたままにし、オーバーヘッドをあまりかけずに定期的にその内容を上書きできる正しい方向に誰かが私を向けることができますか?

編集:ループのすべての反復ではなく、ループの20回の反復ごとに1回ファイルに書き込むことを選択して、CPU使用率を修正しました。以下に示すすべての回答は機能しますが、ファイルを閉じて再度開くことに関連するオーバーヘッドがあります。ありがとう

4

5 に答える 5

3

File.Openwithを使用しFileMode Truncateて、のファイルストリームを作成しますTextWriter

于 2011-04-13T18:37:24.280 に答える
1

C# でファイルを開いたままにし、オーバーヘッドをあまりかけずに定期的にその内容を上書きできる正しい方向に誰かが私を向けることができますか?

これが Silverlight 4 での方法です。Silverlight を使用していないため、分離ストレージは使用しませんが、バッキング ストアに関係なく同じ手法が機能します。

興味深い点は、Write() メソッドにあります。

logWriter.BaseStream.SetLength(0);

Stream.SetLengthメソッドから:

派生クラスでオーバーライドされると、現在のストリームの長さを設定します。

AutoFlush (この例で行ったように) を使用するか、. のlogWriter.Flush()後にを追加して、ストリームをフラッシュしてくださいlogWriter.Write()

/// <summary>
/// Represents a log file in isolated storage.
/// </summary>
public static class Log
{
    private const string FileName = "TestLog.xml";
    private static IsolatedStorageFile isoStore;
    private static IsolatedStorageFileStream logWriterFileStream;
    private static StreamWriter logWriter;

    public static XDocument Xml { get; private set; }

    static Log()
    {
        isoStore = IsolatedStorageFile.GetUserStoreForApplication();
        logWriterFileStream = isoStore.OpenFile(
            FileName, 
            FileMode.Create, 
            FileAccess.Write, 
            FileShare.None);
        logWriter = new StreamWriter(logWriterFileStream);
        logWriter.AutoFlush = true;

        Xml = new XDocument(new XElement("Tests"));
    }

    /// <summary>
    /// Writes a snapshot of the test log XML to isolated storage.
    /// </summary>
    public static void Write(XElement testContextElement)
    {
        Xml.Root.Add(testContextElement);
        logWriter.BaseStream.SetLength(0);
        logWriter.Write(Xml.ToString());
    }
}
于 2011-07-09T21:56:38.767 に答える
0

テキストライターを使用しますが、書き込みを開始する前にファイルの内容をクリアしてください。このようなもの:

        string path = null;//path of file
        byte[] bytes_to_write = null;
        System.IO.File.WriteAllText(path, string.Empty);
        System.IO.FileStream str = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Write, System.IO.FileShare.Read);
        str.Write(bytes_to_write, 0, bytes_to_write.Length);

おそらく、この例の何かが役立つでしょうか?

于 2011-04-13T18:37:09.167 に答える
0

コンストラクターのfalseとして渡します。append parameter

TextWriter tsw = new StreamWriter(path, false);

参照: http://msdn.microsoft.com/en-us/library/system.io.streamwriter.aspx

于 2011-04-13T18:52:37.510 に答える
0

Thread.Sleep を使ってみましたか?

http://msdn.microsoft.com/en-us/library/system.threading.thread.sleep.aspx

于 2011-04-13T21:44:54.070 に答える