c # Сохранить файл открытым, но перезаписать содержимое

#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