tar是把文件打成一个包,并不压缩;
gz是用gzip把打成包的.tar文件压缩;
过程是
先 在ICSharpCode.SharpZipLib.GZip 中的方法解压为tar文件包,
///
var targzpath="xxx/xxx/xxx.tar.gz";
GZipInputStream gzs = new GZipInputStream(targzpath);
FileStream destFile = File.Open("xxx/xxx/xxx", FileMode.Create);
int buffersize = 2048;//缓冲区的尺寸,一般是2048的倍数
byte[] FileData = new byte[buffersize];//创建缓冲数据
while (buffersize > 0)//一直读取到文件末尾
{
buffersize = gzs.Read(FileData, 0, buffersize);//读取压缩文件数据
destFile.Write(FileData, 0, buffersize);//写入目标文件
}
destFile.Close();//关闭目标文件
gzs.Close();
再用 using ICSharpCode.SharpZipLib.Tar; 里方法 还原为文件
/
FileStream fr = new FileStream("xxx/xxx/xxx.tar", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
ICSharpCode.SharpZipLib.Tar.TarInputStream s = new ICSharpCode.SharpZipLib.Tar.TarInputStream(fr);
ICSharpCode.SharpZipLib.Tar.TarEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{
string directoryName = Path.GetDirectoryName(theEntry.Name);
string fileName = Path.GetFileName(theEntry.Name);
if (directoryName != String.Empty)
Directory.CreateDirectory(strUnpackDir + directoryName);//解压到 文件夹
if (fileName != String.Empty)
{
FileStream streamWriter = File.Create(strUnpackDir + theEntry.Name);
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}
streamWriter.Close();
}
}
s.Close();
fr.Close();
要添加引用:
ICSharpCode.SharpZipLib
自己网上找找-------
-------------------------------------------------------------------
好像这样更简单
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.Tar;
/// <summary>
/// 文件解压
/// </summary>
/// <param name="zipPath">压缩文件路径</param>
/// <param name="goalFolder">解压到的目录</param>
/// <returns></returns>
internal static bool UnzipTgz(string zipPath, string goalFolder)
{
Stream inStream = null;
Stream gzipStream = null;
TarArchive tarArchive = null;
try
{
using (inStream = File.OpenRead(zipPath))
{
using (gzipStream = new GZipInputStream(inStream))
{
tarArchive = TarArchive.CreateInputTarArchive(gzipStream);
tarArchive.ExtractContents(goalFolder);
tarArchive.Close();
}
}
return true;
}
catch (Exception ex)
{
LogManager.GetCurrentClassLogger().Error(ex);
return false;
}
finally
{
if (null != tarArchive) tarArchive.Close();
if (null != gzipStream) gzipStream.Close();
if (null != inStream) inStream.Close();
}
}