Можно ли записать массив Byte [] в файл в C #?


346

Я пытаюсь записать Byte[]массив, представляющий полный файл в файл.

Исходный файл от клиента отправляется через TCP, а затем принимается сервером. Полученный поток считывается в байтовый массив и затем отправляется для обработки этим классом.

Это главным образом для того, чтобы гарантировать, что прием TCPClientготов к следующему потоку и отделить принимающую сторону от обрабатывающей стороны.

FileStreamКласс не принимает массив байтов в качестве аргумента или другого объекта потока (который не позволит вам писать байты в нем).

Я хочу, чтобы обработка выполнялась потоком, отличным от исходного (с TCPClient).

Я не знаю, как это реализовать, что мне попробовать?

Ответы:


729

Исходя из первого предложения вопроса: «Я пытаюсь записать массив Byte [], представляющий полный файл в файл».

Путь наименьшего сопротивления будет:

File.WriteAllBytes(string path, byte[] bytes)

Документировано здесь:

System.IO.File.WriteAllBytes - MSDN


40

Вы можете использовать BinaryWriterобъект.

protected bool SaveData(string FileName, byte[] Data)
{
    BinaryWriter Writer = null;
    string Name = @"C:\temp\yourfile.name";

    try
    {
        // Create a new stream to write to the file
        Writer = new BinaryWriter(File.OpenWrite(Name));

        // Writer raw data                
        Writer.Write(Data);
        Writer.Flush();
        Writer.Close();
    }
    catch 
    {
        //...
        return false;
    }

    return true;
}

Редактировать: Ой, забыл finallyчасть ... допустим, это оставлено в качестве упражнения для читателя ;-)


Допустим, я получил сжатые данные и распаковал их в байт []. Возможно ли создать файл обратно, используя вышеуказанную функцию? Любой учебник или демо онлайн?
Кэннон

@buffer_overflow: вам нужно сначала сжать его, если вы хотите вернуть исходный файл. Взгляните на Pattern Decorator для возможной реализации: en.wikipedia.org/wiki/Decorator_pattern
Треб

2
BinaryWriterодноразовый, поэтому, вероятно, следует использовать в usingблоке. Это также означало бы, что вы, возможно, могли бы отказаться от некоторых дополнительных вызовов, поскольку исходный код показывает, что он выполняет некоторую очистку при утилизации.
Джефф Б


11

Вы можете сделать это, используя System.IO.BinaryWriterкоторый принимает поток так:

var bw = new BinaryWriter(File.Open("path",FileMode.OpenOrCreate);
bw.Write(byteArray);

7
Просто хочу добавить, после записи добавить bw.flush и bw.close
dekdev

6
@dekdev: Нет смысла звонить Flush()до того, Close()как Close()начнется флеш. Еще лучше использовать usingпункт, который также будет flush'n'close.
Томас

1
Не забудьте использовать Dispose;
vitor_gaudencio_oliveira



1

Попробуйте BinaryReader:

/// <summary>
/// Convert the Binary AnyFile to Byte[] format
/// </summary>
/// <param name="image"></param>
/// <returns></returns>
public static byte[] ConvertANYFileToBytes(HttpPostedFileBase image)
{
    byte[] imageBytes = null;
    BinaryReader reader = new BinaryReader(image.InputStream);
    imageBytes = reader.ReadBytes((int)image.ContentLength);
    return imageBytes;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.