从字节数组中创建新的文件流

本文关键字:文件 创建 字节 字节数 数组 | 更新日期: 2023-09-27 17:57:14

>我正在尝试从字节数组创建一个新的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);
                    }
                }
            }

感谢您的任何帮助!问候埃文

从字节数组中创建新的文件流

听起来你需要使用MemoryStream。

由于您不知道将从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);
            }  
        }
    }
}

这是我最终所做的。我意识到我的问题中没有提供足够的信息 - 我为此道歉 - 但我知道我需要解压缩的文件的大小,因为我在我的程序前面使用它。此缓冲区称为"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);
                        }
                    }
                }