如何使用MemoryStream C#将.tar格式的文件分组并在gzip中压缩?

时间:2019-05-19 21:09:27

标签: c# memorystream gzipstream sharpziplib

我目前正在使用SharpZipLib库, 在gzip中压缩后,我需要将.tar格式的文件分组,并获取所有压缩的字节。

以下代码可以正常工作,但是我需要执行内存中的所有逻辑并获取字节。

基本代码:

 public static void TarCreateFromStream()
        {

            string tarOutFn = @"D:\\Directory\\CompressTest.tar.gz";
            Stream outStream = File.Create(tarOutFn);
            Stream gzoStream = new GZipOutputStream(outStream);

            TarOutputStream tarOutputStream = new TarOutputStream(gzoStream);

            CreateTarManually(tarOutputStream, @"D:\ReadFile");

            tarOutputStream.Close();
        }

        public static void CreateTarManually(TarOutputStream tarOutputStream, string sourceDirectory)
        {

            TarEntry tarEntry = TarEntry.CreateEntryFromFile(sourceDirectory);
            tarOutputStream.PutNextEntry(tarEntry);

            string[] filenames = Directory.GetFiles(sourceDirectory);

            foreach (string filename in filenames)
            {

                using (Stream inputStream = File.OpenRead(filename))
                {
                    string tarName = filename.Substring(3); 

                    long fileSize = inputStream.Length;
                    TarEntry entry = TarEntry.CreateTarEntry(tarName);

                    entry.Size = fileSize;
                    tarOutputStream.PutNextEntry(entry);

                    byte[] localBuffer = new byte[32 * 1024]; 

                    while (true)
                    {
                        int numRead = inputStream.Read(localBuffer, 0, localBuffer.Length);
                        if (numRead <= 0)
                            break;

                        tarOutputStream.Write(localBuffer, 0, numRead);
                    }

                }
                tarOutputStream.CloseEntry();

            }

            string[] directories = Directory.GetDirectories(sourceDirectory);
            foreach (string directory in directories)
                CreateTarManually(tarOutputStream, directory);
        }

0 个答案:

没有答案