ICSharpCode.SharpZipLib生成tar、tar.gz

源码地址:http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx

 

调用方法:

/// <summary>
/// 生成 ***.tar.gz 文件
/// </summary>
/// <param name="strBasePath">文件基目录(源文件、生成文件所在目录)</param>
/// <param name="strSourceFolderName">待压缩的源文件夹名</param>
public bool CreatTarGzArchive(string strBasePath, string strSourceFolderName)
{
    if (string.IsNullOrEmpty(strBasePath)
        || string.IsNullOrEmpty(strSourceFolderName)
        || !System.IO.Directory.Exists(strBasePath)
        || !System.IO.Directory.Exists(Path.Combine(strBasePath, strSourceFolderName)))
    {
        return false;
    }

    Environment.CurrentDirectory = strBasePath;
    string strSourceFolderAllPath = Path.Combine(strBasePath, strSourceFolderName);
    string strOupFileAllPath = Path.Combine(strBasePath, strSourceFolderName + ".tar.gz");

    Stream outTmpStream = new FileStream(strOupFileAllPath, FileMode.OpenOrCreate);

    //注意此处源文件大小大于4096KB
    Stream outStream = new GZipOutputStream(outTmpStream);
    TarArchive archive = TarArchive.CreateOutputTarArchive(outStream, TarBuffer.DefaultBlockFactor);
    TarEntry entry = TarEntry.CreateEntryFromFile(strSourceFolderAllPath);
    archive.WriteEntry(entry, true);

    if (archive != null)
    {
        archive.Close();
    }

    outTmpStream.Close();
    outStream.Close();

    return true;
}

 

Note:

在linux下使用gzip命令解压生成的tar.gz包会报如下错误:

gzip: dfis_bp.tar.gz: decompression OK, trailing garbage ignored

 

报这样的错通常是因为tar.gz文件的尾部有一串0x00或者0xff,这是由于很多场合下压缩算法都会在压缩完成后补充一些字节以对齐数据块。gzip在正确解压完tar.gz的内容后开始解压这样的全零填充字节就会报这样的错,并不会影响使用。


用安静模式 (gzip -q) 可以消除这些警报。


 

/// <summary>
/// 生成 ***.tar 文件
/// </summary>
/// <param name="strBasePath">文件基目录(源文件、生成文件所在目录)</param>
/// <param name="strSourceFolderName">待压缩的源文件夹名</param>
public bool CreatTarArchive(string strBasePath, string strSourceFolderName)
{
    if (string.IsNullOrEmpty(strBasePath)
        || string.IsNullOrEmpty(strSourceFolderName)
        || !System.IO.Directory.Exists(strBasePath)
        || !System.IO.Directory.Exists(Path.Combine(strBasePath, strSourceFolderName)))
    {
        return false;
    }

    Environment.CurrentDirectory = strBasePath;
    string strSourceFolderAllPath = Path.Combine(strBasePath, strSourceFolderName);
    string strOupFileAllPath = Path.Combine(strBasePath, strSourceFolderName + ".tar");

    Stream outStream = new FileStream(strOupFileAllPath, FileMode.OpenOrCreate);

    TarArchive archive = TarArchive.CreateOutputTarArchive(outStream, TarBuffer.DefaultBlockFactor);
    TarEntry entry = TarEntry.CreateEntryFromFile(strSourceFolderAllPath);
    archive.WriteEntry(entry, true);

    if (archive != null)
    {
        archive.Close();
    }

    outStream.Close();

    return true;
}

 

 

/// <summary>
/// tar包解压
/// </summary>
/// <param name="strFilePath">tar包路径</param>
/// <param name="strUnpackDir">解压到的目录</param>
/// <returns></returns>
public static bool UnpackTarFiles(string strFilePath, string strUnpackDir)
{
    try
    {
        if (!File.Exists(strFilePath))
        {
            return false;
        }

        strUnpackDir = strUnpackDir.Replace("/", "\\");
        if (!strUnpackDir.EndsWith("\\"))
        {
            strUnpackDir += "\\";
        }

        if (!Directory.Exists(strUnpackDir))
        {
            Directory.CreateDirectory(strUnpackDir);
        }

        FileStream fr = new FileStream(strFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
        DhcEc.SharpZipLib.Tar.TarInputStream s = new DhcEc.SharpZipLib.Tar.TarInputStream(fr);
        DhcEc.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();

        return true;
    }
    catch (Exception)
    {
        return false;
    }
} 



 

/// <summary>
/// zip压缩文件
/// </summary>
/// <param name="filename">filename生成的文件的名称,如:C\123\123.zip</param>
/// <param name="directory">directory要压缩的文件夹路径</param>
/// <returns></returns>
public static bool PackFiles(string filename, string directory)
{
    try
    {
        directory = directory.Replace("/", "\\");

        if (!directory.EndsWith("\\"))
            directory += "\\";
        if (!Directory.Exists(directory))
        {
            Directory.CreateDirectory(directory);
        }
        if (File.Exists(filename))
        {
            File.Delete(filename);
        }

        FastZip fz = new FastZip();
        fz.CreateEmptyDirectories = true;
        fz.CreateZip(filename, directory, true, "");

        return true;
    }
    catch (Exception)
    {
        return false;
    }
}


 

/// <summary>
/// zip解压文件
/// </summary>
/// <param name="file">压缩文件的名称,如:C:\123\123.zip</param>
/// <param name="dir">dir要解压的文件夹路径</param>
/// <returns></returns>
public static bool UnpackFiles(string file, string dir)
{
    try
    {
        if (!File.Exists(file))
            return false;

        dir = dir.Replace("/", "\\");
        if (!dir.EndsWith("\\"))
            dir += "\\";

        if (!Directory.Exists(dir))
            Directory.CreateDirectory(dir);

        FileStream fr = new FileStream(strFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
        DhcEc.SharpZipLib.Zip.ZipInputStream s = new DhcEc.SharpZipLib.Zip.ZipInputStream(fr);
        DhcEc.SharpZipLib.Zip.ZipEntry theEntry;
        while ((theEntry = s.GetNextEntry()) != null)
        {
            string directoryName = Path.GetDirectoryName(theEntry.Name);
            string fileName = Path.GetFileName(theEntry.Name);

            if (directoryName != String.Empty)
                Directory.CreateDirectory(dir + directoryName);

            if (fileName != String.Empty)
            {
                FileStream streamWriter = File.Create(dir + 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();

        return true;
    }
    catch (Exception)
    {
        return false;
    }
}



 

评论 4 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

nihao198503

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值