Подтвердить что ты не робот

Сохранить файл из байта [] в С# NET 3.5

Мой клиент TCP получает изображение внутри пакета. Изображение сжимается с помощью zlib. Задача состоит в том, чтобы распаковать изображение и поместить его в форму.

Я планирую сохранить сжатое изображение в текущем каталоге, распаковать его и загрузить распакованный файл в форме.

Первая проблема заключается в сохранении файла (сжатого). zlib может сохранить его распакованными.

Код ниже загружает сжатый файл и сохраняет его после распаковки.

    private void decompressFile(string inFile, string outFile)
    {
        System.IO.FileStream outFileStream = new System.IO.FileStream(outFile, System.IO.FileMode.Create);
        zlib.ZOutputStream outZStream = new zlib.ZOutputStream(outFileStream);
        System.IO.FileStream inFileStream = new System.IO.FileStream(inFile, System.IO.FileMode.Open);          
        try
        {
            CopyStream(inFileStream, outZStream);
        }
        finally
        {
            outZStream.Close();
            outFileStream.Close();
            inFileStream.Close();
        }
    }

    public static void CopyStream(System.IO.Stream input, System.IO.Stream output)
    {
        byte[] buffer = new byte[2000];
        int len;
        while ((len = input.Read(buffer, 0, 2000)) > 0)
        {
            output.Write(buffer, 0, len);
        }
        output.Flush();
    }

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

Любая помощь будет высоко оценена.

Спасибо.

4b9b3361

Ответ 1

Используйте метод static void System.IO.File.WriteAllBytes(метод string path, byte []).

byte[] buffer = new byte[200];
File.WriteAllBytes(@"c:\data.dmp", buffer);

Ответ 2

public static void SaveFile(this Byte[] fileBytes, string fileName)
{
    FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite);
    fileStream.Write(fileBytes, 0, fileBytes.Length);
    fileStream.Close();
}

Ответ 3

В дополнение к тому, что все остальные уже заявили, я также предлагаю вам использовать предложения "using", поскольку все эти объекты реализуют IDisposable.

using(FileStream outFileStream = new ...)
using(ZOutputStream outZStream = new ...)
using(FileStream inFileStream = new ...)
{
    CopyStream(inFileStream, outZStream);
}

Ответ 4

Вставьте массив байтов, который вы получили, в MemoryStream и сжимаете/распаковываете его на лету без использования временных файлов.

Ответ 5

Вы можете попробовать этот код

 private void t1()
    {
        FileStream f1 = new FileStream("C:\\myfile1.txt", FileMode.Open);
        int length = Convert.ToInt16(f1.Length);
        Byte[] b1 = new Byte[length];
        f1.Read(b1, 0, length);
        File.WriteAllBytes("C:\\myfile.txt",b1);
        f1.Dispose();
    }