我有第三方应用程序定期从我的C#.Net应用程序中读取输出。
由于某些限制,我只能将输出写入文件,然后由第三方应用程序读取。
我每次都需要覆盖同一文件的内容 我目前正在使用
在C#中进行此操作Loop
{
//do some work
File.WriteAllText(path,Text);
}
第三方应用程序会定期检查文件并读取内容。这很好用,但CPU使用率非常高。用文本编写器替换File.WriteAllText解决了高CPU使用率的问题,但随后我的文本被附加到文件而不是覆盖文件。
有人能指出我正确的方向,我可以在C#中保持文件打开并定期覆盖其内容而不会产生太多开销吗?
编辑:我通过选择每循环20次迭代而不是循环的每次迭代来写入文件来修复CPU使用率。下面给出的所有答案都有效,但是有关闭文件和重新打开的开销。感谢
答案 0 :(得分:3)
将File.Open
与FileMode
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)
您是否尝试过使用Thread.Sleep?
http://msdn.microsoft.com/en-us/library/system.threading.thread.sleep.aspx