Сохранить файл из байта [] в C # NET 3.5 - PullRequest
17 голосов
/ 09 апреля 2009

Мой 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 [] в качестве входного файла.

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

Спасибо.

Ответы [ 5 ]

79 голосов
/ 09 апреля 2009

Используйте статический метод void System.IO.File.WriteAllBytes (путь строки, байт [] байт).

byte[] buffer = new byte[200];
File.WriteAllBytes(@"c:\data.dmp", buffer);
5 голосов
/ 09 апреля 2009
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 голосов
/ 09 апреля 2009

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

using(FileStream outFileStream = new ...)
using(ZOutputStream outZStream = new ...)
using(FileStream inFileStream = new ...)
{
    CopyStream(inFileStream, outZStream);
}
1 голос
/ 09 апреля 2009

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

0 голосов
/ 09 апреля 2009

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

 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();
    }
...