Чи можна записати масив байтів [] у файл на C #?


344

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

Оригінальний файл від клієнта надсилається через TCP і потім отримується сервером. Отриманий потік зчитується в байтовий масив і потім надсилається для обробки цим класом.

Це головним чином для того, щоб прийом TCPClientбув готовий до наступного потоку та відокремив приймальний кінець від кінця обробки.

FileStreamКлас не приймає масив байтів в якості аргументу або іншого об'єкта потоку (який не дозволить вам писати байти в ньому).

Я маю на меті зробити обробку виконаною іншим потоком від оригіналу (той, що має TCPClient).

Я не знаю, як це здійснити, що мені слід спробувати?

Відповіді:


728

Виходячи з першого речення питання: "Я намагаюся виписати масив 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частину ... дозвольмо сказати, що це залишається як вправа для читача ;-)


Скажімо, я отримав стислі дані, і я декомпресував їх у байт []. Чи можливо створити файл назад за допомогою наведеної вище функції? Будь-який підручник чи демо в Інтернеті?
Cannon

@buffer_overflow: Якщо потрібно повернути оригінальний файл, спочатку потрібно його стиснути. Подивіться на шаблон Decorator для можливої реалізації: en.wikipedia.org/wiki/Decorator_pattern
треб

2
BinaryWriterє одноразовим, тому, ймовірно, слід використовувати в usingблоці. Це також означатиме, що ви, можливо, можете залишити деякі додаткові дзвінки, оскільки вихідний код показує, що він виконує чистку під час утилізації.
Джефф Б


11

Ви можете зробити це, використовуючи System.IO.BinaryWriterякий приймає Stream так:

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

7
Просто хочу додати після написання add bw.flush and bw.close
dekdev

6
@dekdev: Немає сенсу зателефонувати Flush()раніше, Close()як спалахне Close(). Ще краще - скористатись usingпропозицією, яка також розмине.
Томаш

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.