#c# #file #overwrite
#c# #файл #перезаписать
Вопрос:
У меня есть стороннее приложение, которое периодически считывает выходные данные с моего C #.Сетевое приложение.
Из-за определенных ограничений я могу записывать выходные данные только в файл, который затем считывается сторонним приложением.
Мне нужно каждый раз перезаписывать содержимое одного и того же файла.
В настоящее время я делаю это на C #, используя
Loop
{
//do some work
File.WriteAllText(path,Text);
}
Стороннее приложение периодически проверяет файл и считывает содержимое. Это работает хорошо, но очень сильно увеличивает загрузку процессора. Замена файла.Запись всего текста с помощью средства записи текста решает проблему высокой загрузки процессора, но тогда мой текст добавляется к файлу вместо перезаписи файла.
Может ли кто-нибудь указать мне правильное направление, в котором я могу сохранить файл открытым на C # и периодически перезаписывать его содержимое без особых накладных расходов?
Редактировать: Я исправил загрузку процессора, выбрав запись в файл один раз каждые 20 итераций цикла вместо каждой итерации цикла. Все ответы, приведенные ниже, работают, но имеют накладные расходы, связанные с закрытием файла и повторным открытием. Спасибо
Ответ №1:
Используйте File.Open
with FileMode
Truncate
для создания потока файлов для вашего TextWriter
.
Ответ №2:
Может ли кто-нибудь указать мне правильное направление, в котором я могу сохранить файл открытым на C # и периодически перезаписывать его содержимое без особых накладных расходов?
Вот как я это сделал в Silverlight 4. Поскольку вы не используете Silverlight, вы не будете использовать изолированное хранилище, но тот же метод будет работать независимо от резервного хранилища.
Интересный момент заключается в методе Write():
logWriter.BaseStream.SetLength(0);
Из Stream.SetLength
метода:
При переопределении в производном классе задает длину текущего потока.
Обязательно очистите поток, используя либо автозапуск (как я сделал в этом примере), либо добавив 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());
}
}
Ответ №3:
Используйте средство записи текста, но очистите содержимое файла перед началом записи. Что-то вроде этого:
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);
Возможно, что-то из этого примера поможет?
Комментарии:
1. Очищаю файл каждый раз в моем цикле, используя System.IO.File. WriteAllText(путь, строка. Пусто); также приведет к тем же накладным расходам, поскольку мне придется делать это повторно в цикле.
Ответ №4:
Передать false
как append parameter
конструктора:
TextWriter tsw = new StreamWriter(path, false);
Ссылка:http://msdn.microsoft.com/en-us/library/system.io.streamwriter.aspx
Ответ №5:
Вы пробовали использовать Thread.Сон?
http://msdn.microsoft.com/en-us/library/system.threading.thread.sleep.aspx