微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当存档较小时,sharpZipLib创建损坏的tar.gz

如何解决当存档较小时,sharpZipLib创建损坏的tar.gz

我正在使用SharpZipLib 1.2.0创建tar.gz文件,只要存档“很大”,它就可以完美地工作。 但是,如果我仅将一个或几个小文件放入存档,并且生成的tar.gz很小(限制似乎在600字节左右),它将损坏。 7-Zip显示消息“无法打开文件...作为存档”。

任何想法是什么问题?

注意:
我需要以正确的顺序将目录结构添加到存档中(在其所属目录之前不能添加任何文件),否则目标程序将无法使用它。但是,即使没有那段代码,问题依然存在。

  private void WriteTarGz(string path)
        {        
            Stream outStream = null;
            GZipOutputStream gzoStream = null;
            Tararchive tararchive = null;    
            try
            {
                outStream = File.Create(path);
                gzoStream = new GZipOutputStream(outStream);
                gzoStream.SetLevel(1); 
                tararchive = Tararchive.CreateOutputTararchive(gzoStream);
                tararchive.RootPath = Path.GetDirectoryName(DbModel.BasePath);

                AddDbFilesToTar(tararchive);
            }
            catch (IOException e)
            {
               //...
            }       
            catch (Exception e)
            {
               // HandleWriteFileException("tar file",_finalTarFilePath,e.Message);
            }
            finally
            {
                try { tararchive?.Close(); } catch (Exception){ /*ignored*/ } 
                try { gzoStream?.Close(); } catch (Exception) { /*ignored*/}
                try { outStream?.Close(); } catch (Exception) { /*ignored*/ }
            }
        }

        private void AddDbFilesToTar(Tararchive tararchive)
        {
            string dbroot = Directory.GetParent(DbModel.BasePath).FullName;         
            List<string> allcopiedIntermediateDirectories = new List<string>();
            foreach (string file in DbModel.FilesTocopy)
            {                                                 
                    AddDirectoryStructure(ref tararchive,Directory.GetParent(file).FullName,ref allcopiedIntermediateDirectories,dbroot);
                    AddToTar(tararchive,file);        
            }
        }

        private void AddDirectoryStructure(ref Tararchive tararchive,string directory,ref List<string> allcopiedIntermediateDirectories,string root)
        {
            List<string> intermediateFoldersTocopy = new List<string>();

            // find intermediate folders       
            while (!directory.Equals(root))
            {
                intermediateFoldersTocopy.Add(directory);
                directory = Directory.GetParent(directory).FullName;
            }
            intermediateFoldersTocopy.Reverse();

            //add intermediateFolders to tar
            foreach (string dir in intermediateFoldersTocopy)
            {
                if (!allcopiedIntermediateDirectories.Contains(dir))
                {
                    AddToTar(tararchive,dir);
                    allcopiedIntermediateDirectories.Add(dir);
                }
            }
        }

        private void AddToTar(Tararchive tararchive,string file,string name = null)
        {
            TarEntry tarEntry = TarEntry.CreateEntryFromFile(file);
            if(!(name is null))
            {
                tarEntry.Name = name;
            }
            tararchive.WriteEntry(tarEntry,false);
        }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。