c # Запись в файл без использования {} - PullRequest
5 голосов
/ 07 января 2010

Я пишу небольшое приложение, в котором хочу записать результаты операций в файл.

По сути, я хочу открыть поток для файла (я думаю FileStream , но я открыт для предложений), записать данные в файл, а затем закрыть его позже.

Итак, у меня есть класс с именем ReportFile , с методами:

.Create( string path )

.WriteInfo( string a, string b, string c ) ; //Or something like this...

//Then sometime in the future

.Close()

Таким образом, класс, использующий класс ReportFile , создаст экземпляр, несколько раз вызовет WriteInfo(..), пока он не завершит делать то, что ему нужно, а затем вызовет Close() в какой-то момент в будущем.

Теперь я знаю, что мне нужно реализовать шаблон Dispose для класса ReportFile , чтобы гарантировать, что, если что-то пойдет не так, что дескриптор файла будет соответствующим образом обработан.

Однако до сих пор я не смог найти что-либо на веб-странице, показывающей хороший способ держать файл открытым, а затем проверять, нужно ли его закрывать, большинство примеров просто открывают файл и пишут затем закройте его - все внутри using{} конструкции.

В классе ReportFile я хочу иметь возможность проверить, не закрыт ли экземпляр FileStream, чтобы я мог закрыть его и освободить ресурс.

Кто-нибудь знает хорошую ссылку на ссылку или любой другой совет?

(О, я должен упомянуть, что я не делаю C # полный рабочий день, это всего лишь хобби, поэтому, если это глупый вопрос, мои извинения; -)

Ответы [ 6 ]

3 голосов
/ 07 января 2010

Есть ли особая причина, по которой вы должны держать файл открытым?

В этой ситуации я бы просто каждый раз открывал файл с помощью FileMode.Append (или передавал append = true в StreamWriter ctor), а затем снова закрывал его с использованием. например:

void WriteInfo(string text)
{
    // Second parameter to StreamWriter ctor is append = true
    using(StreamWriter sw = new StreamWriter(logFilePath, true))
    {
         sw.WriteLine(text);
    }
}

При таком подходе вам на самом деле не нужен метод Create () или Close (). Приложение append = true создаст файл, если он не существует.

3 голосов
/ 07 января 2010

ReportFile будет иметь только экземплярную переменную TextWriter, которую вы будете располагать в своем собственном методе Dispose().

Почему вы хотите иметь явный метод Close(), кстати?В любом случае, ваши вызывающие абоненты должны использовать оператор using, так почему же они хотели бы также явно вызывать Close?

1 голос
/ 07 января 2010

public void Create (путь к строке) { mStream = новый FileStream (путь); }

public void Dispose () { if (mStream! = null) mStream.Dispose (); }

1 голос
/ 07 января 2010

Хуста, я думаю, что ты немного обдумываешь эту функцию.Причина, по которой вы видите примеры с использованием конструкции using, заключается в том, что использование {} с записью в файл довольно быстро и безопасно.

Скорее всего, вы не открываете и не закрываете файл несколько раз в секунду, поэтому нет необходимости держать его открытым все время и, таким образом, вы рискуете покинуть приложение, не закрывая файл (что является исправлением PITAпосле факта.) Использование конструкции using гарантирует, что ресурс, в данном случае ваш файл, будет выпущен и правильно закрыт.

Еще один совет по программированию: с самого начала не беспокойтесь об эффективности.Начните работать сначала самым простым способом, а потом улучшите скорость / производительность, только если это необходимо.

0 голосов
/ 07 января 2010

В случае, если вы просто не используете конструкцию using {}, вы можете использовать интерфейс IDisposable: http://msdn.microsoft.com/en-us/library/system.idisposable.dispose.aspx

0 голосов
/ 07 января 2010

Я бы предложил использовать конструкцию «using» и держать файл открытым только во время сохранения.

Идея может заключаться в том, чтобы создать контент в памяти, а затем сохранить его, когда вы будете готовы. например, используя StringBuilder.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...