Здравствуйте, tapatoon, Вы писали:
T>Действительно, ох уже мне эти disposable... спасибо
1. Можно ставить using сразу на BinaryWriter. Для удобства он автоматически закрывает stream (чтобы это отключить, нужно использовать специальный конструктор):
using (var bw = new BinaryWriter(new FileStream(filePath, FileMode.Create, FileAccess.Write)))
while (byte[] data = get_data())
bw.Write(data);
2. А зачем вам вообще BinaryWriter? Вы же пишете сырые байты. BinaryWriter нужен для записи структурированных данных.
using (var stream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
while (byte[] data = get_data())
stream.Write(data);
T>Если флэшить файловый стрим, всё данные о размере обновляются, хоть файл и открыт.
Ну вот как раз флэш, помимо сброса внутреннего буфера FileStream в системный file handle, ещё и делает FlushOSBuffer. Под виндой это вызов FlushFileBuffers, который как раз не только сбрасывает внутренний буфер, но и обновляет метаданные.
T>Переделал на винапи — поведение с размером файла такое же. Только быстрее раз в 100)
Винапи делает программу непортабельной.
Такая разница в скорости означает, что вы как-то неправильно применяете классы из System.IO. Попробуйте применить их правильно, и получить перформанс сравнимый с винапи.