保持文件打开,但覆盖内容

本文关键字:覆盖 文件 | 更新日期: 2023-09-27 17:49:57

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

我需要每次覆盖同一个文件的内容。
我现在在c#中使用

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

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

有人能指出我在正确的方向,我可以保持一个文件在c#中打开,并定期覆盖其内容没有太多的开销?

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

保持文件打开,但覆盖内容

使用File.OpenFileMode Truncate为您的TextWriter创建文件流

有人能指出我在正确的方向,我可以保持一个文件在c#中打开,并定期覆盖其内容没有太多的开销?

这是我在Silverlight 4中做的。因为你没有使用Silverlight,所以你不会使用独立的存储,但是不管后备存储是什么,同样的技术都可以工作。

有趣的是在Write()方法中:

logWriter.BaseStream.SetLength(0);

From Stream.SetLength Method:

在派生类中重写时,设置当前流的长度。

确保使用AutoFlush(如我在本例中所做的)或在logWriter.Write()之后添加logWriter.Flush()来刷新流。

/// <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());
    }
}

使用文本写入器,但在开始写入之前清除文件的内容。像这样:

        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);

也许这个例子会有所帮助?

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

TextWriter tsw = new StreamWriter(path, false);

裁判:http://msdn.microsoft.com/en-us/library/system.io.streamwriter.aspx

你试过使用Thread.Sleep吗?

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