Создать новый FileStream из байтового массива - PullRequest
4 голосов
/ 20 мая 2011

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

Задачи, которые я выполняю: 1) Чтение исходного файла, который ранее был сжатым 2) Распаковка данных с использованием GZipStream 3) копирование распакованных данных в байтовый массив.

Что бы я хотел изменить:

1) Я хотел бы иметь возможность использовать File.ReadAllBytes для чтения распакованных данных. 2) Затем я хотел бы создать новый объект файлового потока, используя этот байтовый массив.

Короче говоря, я хочу выполнить всю эту операцию, используя байтовые массивы. Один из параметров GZipStream - это какой-то поток, поэтому я решил, что застрял, используя файловый поток. Но если существует какой-то метод, в котором я могу создать новый экземпляр FileStream из байтового массива - тогда все будет в порядке.

Вот что у меня есть:

FolderBrowserDialog fbd = new FolderBrowserDialog(); // Shows a browser dialog
 fbd.ShowDialog();

            // Path to directory of files to compress and decompress.
            string dirpath = fbd.SelectedPath;

            DirectoryInfo di = new DirectoryInfo(dirpath);


 foreach (FileInfo fi in di.GetFiles())
            {
                zip.Program.Decompress(fi);

            }

            // Get the stream of the source file.
            using (FileStream inFile = fi.OpenRead())
            {

                //Create the decompressed file.
                string outfile = @"C:\Decompressed.exe";
                {
                    using (GZipStream Decompress = new GZipStream(inFile,
                            CompressionMode.Decompress))
                    {
                        byte[] b = new byte[blen.Length];
                        Decompress.Read(b,0,b.Length);
                        File.WriteAllBytes(outfile, b);
                    }
                }
            }

Спасибо за любую помощь! С Уважением, Evan

Ответы [ 3 ]

5 голосов
/ 20 мая 2011

Звучит так, как будто вам нужно использовать MemoryStream .

4 голосов
/ 20 мая 2011

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

const int BufferSize = 65536;
byte[] compressedBytes = File.ReadAllBytes("compressedFilename");
// create memory stream
using (var mstrm = new MemoryStream(compressedBytes))
{
    using(var inStream = new GzipStream(mstrm, CompressionMode.Decompress))
    {
        using (var outStream = File.Create("outputfilename"))
        {
            var buffer = new byte[BufferSize];
            int bytesRead;
            while ((bytesRead = inStream.Read(buffer, 0, BufferSize)) != 0)
            {
                outStream.Write(buffer, 0, bytesRead);
            }  
        }
    }
}
2 голосов
/ 20 мая 2011

Вот что я в итоге сделал. Я понимаю, что не дал достаточной информации в своем вопросе - и извиняюсь за это - но я знаю размер файла, который мне нужно распаковать, так как я использую его ранее в своей программе. Этот буфер называется «blen».

string fi = @"C:\Path To Compressed File";
    // Get the stream of the source file.
           //     using (FileStream inFile = fi.OpenRead())
                using (MemoryStream infile1 = new MemoryStream(File.ReadAllBytes(fi)))
                {

                    //Create the decompressed file.
                    string outfile = @"C:\Decompressed.exe";
                    {
                        using (GZipStream Decompress = new GZipStream(infile1,
                                CompressionMode.Decompress))
                        {
                            byte[] b = new byte[blen.Length];
                            Decompress.Read(b,0,b.Length);
                            File.WriteAllBytes(outfile, b);
                        }
                    }
                }
...