c # Держите файл открытым, но перезаписывайте содержимое - PullRequest
1 голос
/ 13 апреля 2011

У меня есть стороннее приложение, которое периодически читает выходные данные из моего приложения C # .Net.Из-за определенных ограничений я могу записать вывод только в файл, который затем будет прочитан сторонним приложением.

Мне нужно каждый раз перезаписывать содержимое одного и того же файла.В настоящее время я делаю это в C #, используя

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

Стороннее приложение периодически проверяет файл и читает содержимое.Это хорошо работает, но сильно увеличивает загрузку процессора.Замена File.WriteAllText на средство записи текста решает проблему высокой загрузки ЦП, но затем мой текст добавляется в файл вместо перезаписи файла.

Может ли кто-нибудь указать мне правильное направление, в котором я могу сохранить файлоткрывать в C # и периодически перезаписывать его содержимое без особых накладных расходов?

Редактировать: я исправил использование ЦП, выбрав запись в файл один раз каждые 20 итераций цикла вместо каждой итерации цикла.Все ответы, приведенные ниже, работают, но накладные расходы связаны с закрытием файла и повторным открытием.Спасибо

Ответы [ 5 ]

3 голосов
/ 13 апреля 2011

Используйте File.Open с FileMode Truncate, чтобы создать поток файлов для вашего TextWriter.

1 голос
/ 10 июля 2011

Может ли кто-нибудь указать мне правильное направление, где я могу оставить файл открытым в C # и периодически перезаписывать его содержимое без лишних накладных расходов?

Вот как я это сделал в Silverlight4. Поскольку вы не используете Silverlight, вы не будете использовать изолированное хранилище, но один и тот же метод будет работать независимо от резервного хранилища.

Интересный момент заключается в методе Write ():

logWriter.BaseStream.SetLength(0);

From Stream.SetLength Метод:

При переопределении в производном классе задает длину текущего потока.

Beобязательно очистите поток, используя либо 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());
    }
}
0 голосов
/ 14 апреля 2011

Вы пробовали использовать Thread.Sleep?

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

0 голосов
/ 13 апреля 2011

Передача false в качестве append parameter конструктора:

TextWriter tsw = new StreamWriter(path, false);

Ссылка: http://msdn.microsoft.com/en-us/library/system.io.streamwriter.aspx

0 голосов
/ 13 апреля 2011

Используйте средство записи текста, но очистите содержимое файла перед началом записи.Примерно так:

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

Возможно, что-то из этого примера поможет?

...