В прошлом я всегда использовал объект FileStream записать или переписать весь файл, после которого я сразу закрыл бы поток. Однако теперь я работаю над программой, в которой я хочу сохранить FileStream открытым, чтобы позволить пользователю сохранять доступ к файлу, в то время как они работают промежуточные, сохраняет. (См. мой предыдущий вопрос).
Я использую XmlSerializer для сериализации моих классов к от и XML-файл. Но теперь я сохраняю FileStream открытым, чтобы использоваться для сохранения (повторно сериализированный) мой экземпляр класса позже. Есть ли какие-либо особые условия, которые я должен сделать, если я снова использую тот же Поток Файла много раз, по сравнению с использованием нового потока файла? Я должен сбросить поток к началу между, сохраняет? Если более позднее сохранение будет меньшим в размере, чем предыдущее сохранение, то FileStream оставит байты остатка из старого файла и таким образом создаст поврежденный файл? Я должен сделать что-то для очистки файла, таким образом, он будет вести себя, как будто я пишу совершенно новому файлу каждый раз?
Ваше подозрение верно - если вы сбросите позицию потока открытого файла и запишете содержимое, которое меньше того, что уже есть в файле, это приведет к оставлению данных за кадром и к повреждению файла (в зависимости от вашего определения "повреждения", конечно).
Если вы хотите перезаписать файл, вам действительно следует закрыть поток, когда вы закончите с ним, и создать новый поток, когда вы будете готовы к повторному сохранению.
Из вашего вопроса по ссылке я заметил, что вы держите файл открытым, чтобы предотвратить одновременную запись в него других пользователей. Это, вероятно, не мой выбор, но если вы собираетесь так поступить, то я думаю, что вы можете "очистить" файл, вызвав stream.SetLength(0)
между последовательными сохранениями.
Есть разные способы сделать это; если вы открываете файл заново, возможно, установите для него усечение:
using(var file = new FileStream(path, FileMode.Truncate)) {
// write
}
Если вы перезаписываете уже открытый файл, то просто обрежьте его после записи:
file.SetLength(file.Position); // assumes we're at the new end
Я бы постарался избежать delete/recreate, поскольку при этом теряются все ACL и т.д.
Большинство современных браузеров поддерживают 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) для усечения файла перед его перезаписью.
Исходя из вашего вопроса, я думаю, вам лучше закрыть / снова открыть основной файл. Кажется, вы ничего не делаете, кроме записи всего файла. Значение, которое вы можете добавить, переписав Open / Close / Flush / Seek, будет рядом с 0. Сконцентрируйтесь на своей бизнес-проблеме.