Многократное использование filestream

В прошлом я всегда использовал объект FileStream записать или переписать весь файл, после которого я сразу закрыл бы поток. Однако теперь я работаю над программой, в которой я хочу сохранить FileStream открытым, чтобы позволить пользователю сохранять доступ к файлу, в то время как они работают промежуточные, сохраняет. (См. мой предыдущий вопрос).

Я использую XmlSerializer для сериализации моих классов к от и XML-файл. Но теперь я сохраняю FileStream открытым, чтобы использоваться для сохранения (повторно сериализированный) мой экземпляр класса позже. Есть ли какие-либо особые условия, которые я должен сделать, если я снова использую тот же Поток Файла много раз, по сравнению с использованием нового потока файла? Я должен сбросить поток к началу между, сохраняет? Если более позднее сохранение будет меньшим в размере, чем предыдущее сохранение, то FileStream оставит байты остатка из старого файла и таким образом создаст поврежденный файл? Я должен сделать что-то для очистки файла, таким образом, он будет вести себя, как будто я пишу совершенно новому файлу каждый раз?

17
задан Community 23 May 2017 в 11:46
поделиться

4 ответа

Ваше подозрение верно - если вы сбросите позицию потока открытого файла и запишете содержимое, которое меньше того, что уже есть в файле, это приведет к оставлению данных за кадром и к повреждению файла (в зависимости от вашего определения "повреждения", конечно).

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

Из вашего вопроса по ссылке я заметил, что вы держите файл открытым, чтобы предотвратить одновременную запись в него других пользователей. Это, вероятно, не мой выбор, но если вы собираетесь так поступить, то я думаю, что вы можете "очистить" файл, вызвав stream.SetLength(0) между последовательными сохранениями.

14
ответ дан 30 November 2019 в 12:19
поделиться

Есть разные способы сделать это; если вы открываете файл заново, возможно, установите для него усечение:

using(var file = new FileStream(path, FileMode.Truncate)) {
    // write
}

Если вы перезаписываете уже открытый файл, то просто обрежьте его после записи:

file.SetLength(file.Position); // assumes we're at the new end

Я бы постарался избежать delete/recreate, поскольку при этом теряются все ACL и т.д.

10
ответ дан 30 November 2019 в 12:19
поделиться

Большинство современных браузеров поддерживают console.dir (obj) , который возвращает все свойства объекта, унаследованные от конструктора. Дополнительную информацию и текущую поддержку браузера см. в документации Mozilla .

console.dir(Math)
=> MathConstructor
E: 2.718281828459045
LN2: 0.6931471805599453
...
tan: function tan() { [native code] }
__proto__: Object
-121--591387-

Вы думали об использовании объекта TransacityScope вместо попытки отката транзакции вручную? Я знаю, что иногда это невозможно, но в большинстве случаев для меня TransacureScope работал лакомство. Таким образом, мне не нужно было управлять элементами отката вручную - ручные откаты могут быть проблемой в любом случае, потому что данные находятся в "нестабильном" состоянии, что может испортить всю вашу логику.

-121--2275634-

Другой вариант - использовать SetLength (0) для усечения файла перед его перезаписью.

7
ответ дан 30 November 2019 в 12:19
поделиться

Исходя из вашего вопроса, я думаю, вам лучше закрыть / снова открыть основной файл. Кажется, вы ничего не делаете, кроме записи всего файла. Значение, которое вы можете добавить, переписав Open / Close / Flush / Seek, будет рядом с 0. Сконцентрируйтесь на своей бизнес-проблеме.

0
ответ дан 30 November 2019 в 12:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: