问题描述
我正在使用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 (将#修改为@)