c#保持文件打开但覆盖内容

时间:2011-04-13 18:30:53

标签: c# file overwrite

我有第三方应用程序定期从我的C#.Net应用程序中读取输出。
由于某些限制,我只能将输出写入文件,然后由第三方应用程序读取。

我每次都需要覆盖同一文件的内容 我目前正在使用

在C#中进行此操作
Loop
{
  //do some work
  File.WriteAllText(path,Text);
}

第三方应用程序会定期检查文件并读取内容。这很好用,但CPU使用率非常高。用文本编写器替换File.WriteAllText解决了高CPU使用率的问题,但随后我的文本被附加到文件而不是覆盖文件。

有人能指出我正确的方向,我可以在C#中保持文件打开并定期覆盖其内容而不会产生太多开销吗?

编辑:我通过选择每循环20次迭代而不是循环的每次迭代来写入文件来修复CPU使用率。下面给出的所有答案都有效,但是有关闭文件和重新打开的开销。感谢

5 个答案:

答案 0 :(得分:3)

File.OpenFileMode Truncate一起使用,为TextWriter创建文件流。

答案 1 :(得分: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());
    }
}

答案 2 :(得分: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);

这个例子中的某些内容可能会有所帮助吗?

答案 3 :(得分:0)

false作为构造函数的append parameter传递:

TextWriter tsw = new StreamWriter(path, false);

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

答案 4 :(得分:0)