Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > BinaryWriter


Автор: Riddik 24.3.2012, 17:38
Привет!

Пишу в файл в двоичном формате, как правильно закрывать:

Код

FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
BinaryWriter bw = new BinaryWriter(fs);        

bw.Write(data1);
bw.Write(data2);

bw.Close();
//или
fs.Close();

Автор: Cheloveck 24.3.2012, 22:00
Код

using(FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
using(BinaryWriter bw = new BinaryWriter(fs)) {
    bw.Write(data1);
    bw.Write(data2);
}

Так

Автор: Riddik 25.3.2012, 01:46
Закроются сами в деструкторах или как? 

Я на C# гость непостоянный:)

Спасибо.

Автор: Cheloveck 25.3.2012, 16:09
Закроются при вызове метода Dispose, который автоматом вызывается при выходе из using

Автор: VirusUZ 3.4.2012, 11:05
Код

using System;
using System.IO;
namespace conf.App_Code.Utils {
    [Serializable]
    public class Binary : MarshalByRefObject, IBinary {
        public byte[] ReadFile(string filePath) {
            try {
                string temp =  filePath;
                return File.ReadAllBytes(temp);
            } catch { return null; }
        }
        public void Write(string filePath, byte[] b) {
            string cp = filePath;
            new FileInfo(cp).Directory.Create();
            try {
                File.WriteAllBytes(cp, b);
            } catch {
                File.Delete(cp);
                File.WriteAllBytes(cp, b);
            }
        }
        public byte[] ReadSuper(string filePath) {
            try {
                return File.ReadAllBytes(filePath);
            } catch { return null; }
        }
        public FileStream StreamSuper(string path) {
            return new FileStream(path, FileMode.Open);
        }
        public string ReadText(string path) {
            return File.ReadAllText(path);
        }
        public void CreateFolder(string path) {
            Directory.CreateDirectory(path);
        }
        public string GetDirectory(string path) {
            return Directory.GetParent(path).FullName;
        }
    }
}

Автор: jonie 17.4.2012, 20:17
на самом деле тут есть косяк архитектуры. BinaryWriter по-умолчанию закрывает underlying stream ("тот не котором создается") при закрытии самого BinaryWriter (что лично меня сильно бесит).
То есть правильный ответ будет: достаточно закрывать BinaryWriter - после его закрытия стрим тоже будет закрыт (но не Dispose-нут).

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)