保持文件打开,但覆盖内容
本文关键字:覆盖 文件 | 更新日期: 2023-09-27 17:49:57
我有一个第三方应用程序,定期从我的c#中读取输出。网络应用程序。
由于某些限制,我只能将输出写入文件,然后由第三方应用程序读取。
我需要每次覆盖同一个文件的内容。
我现在在c#中使用
Loop
{
//do some work
File.WriteAllText(path,Text);
}
第三方应用程序定期检查文件并读取内容。这可以很好地工作,但会使CPU使用率非常高。替换文件。WriteAllText与文本写入器解决了高CPU使用率的问题,但随后我的文本被附加到文件,而不是覆盖文件。
有人能指出我在正确的方向,我可以保持一个文件在c#中打开,并定期覆盖其内容没有太多的开销?
编辑:我通过选择每20次循环写入文件而不是每次循环迭代来修复CPU使用。下面给出的所有答案都是有效的,但是在关闭文件和重新打开时有开销。由于
使用File.Open
与FileMode
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