提取.zip和放入.jar的最佳方法

时间:2012-08-02 14:06:07

标签: vb.net dotnetzip sharpziplib

我一直在尝试找到最好的方法来实现这一点我想到了解除.jar的内容然后将文件移动到目录中然后将其作为jar放回去。我不确定是最好的解决方案或我将如何做到这一点。我看过DotNetZip& SharpZipLib但不知道使用什么。

如果有人可以给我一个关于如何执行此操作的代码的链接,我们将不胜感激。

2 个答案:

答案 0 :(得分:0)

对于DotNetZip,您可以找到非常简单的VB.NET示例,包括创建zip存档和将zip存档解压缩到目录here中。请记住使用扩展名 .jar 保存压缩文件。

对于SharpZipLib,有一些更全面的存档创建和提取示例here

如果这些库都没有设法提取完整的JAR存档,您还可以考虑访问更成熟的压缩软件,例如7-zip,或者使用Process.Start将其作为单独的进程启动,或者使用其COM接口访问7za.dll中的相关方法。有关COM使用的更多信息可以在here找到。

答案 1 :(得分:0)

我认为您正在使用Minecraft 1.3.1没有?如果是的话,zip中包含一个名为aux.class的文件,遗憾的是它是windows中的保留文件名。我一直在尝试自动化修改过程,同时自己操作jar文件,但收效甚微。我还没有探索的唯一选择是找到一种方法将jar文件的内容提取到临时位置,同时观察该异常。发生这种情况时,将文件重命名为临时名称,提取并继续。然后在重新创建zip文件时,在归档文件中为文件指定原始名称。根据我自己的经验,SharZipLib并不能很好地完成您所需要的工作,或者至少我无法弄清楚如何做到这一点。我建议使用Ionic Zip(Dot Net Zip),并在有问题的文件上尝试重命名路由。另外,我还发布了一个关于此的问题。你可以看到我在Extract zip entries to another Zip file

的距离

编辑 - 我测试了.net zip更多(可从http://dotnetzip.codeplex.com/获得),以及你所需要的内容。我想它将适用于任何包含保留文件名的zip文件。我知道它在C#中,但是你不能为你做所有的工作:P

    public static void CopyToZip(string inArchive, string outArchive, string tempPath)
    {
        ZipFile inZip = null;
        ZipFile outZip = null;

        try
        {
            inZip = new ZipFile(inArchive);
            outZip = new ZipFile(outArchive);
            List<string> tempNames = new List<string>();
            List<string> originalNames = new List<string>();
            int I = 0;
            foreach (ZipEntry entry in inZip)
            {
                if (!entry.IsDirectory)
                {
                    string tempName = Path.Combine(tempPath, "tmp.tmp");
                    string oldName = entry.FileName;
                    byte[] buffer = new byte[4026];
                    Stream inStream = null;
                    FileStream stream = null;
                    try
                    {
                        inStream = entry.OpenReader();
                        stream = new FileStream(tempName, FileMode.Create, FileAccess.ReadWrite);
                        int size = 0;
                        while ((size = inStream.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            stream.Write(buffer, 0, size);
                        }
                        inStream.Close();
                        stream.Flush();
                        stream.Close();
                        inStream = new FileStream(tempName, FileMode.Open, FileAccess.Read);

                        outZip.AddEntry(oldName, inStream);
                        outZip.Save();
                    }
                    catch (Exception exe)
                    {
                        throw exe;
                    }
                    finally
                    {
                        try { inStream.Close(); }
                        catch (Exception ignore) { }
                        try { stream.Close(); }
                        catch (Exception ignore) { }
                    }
                }
            }

        }
        catch (Exception e)
        {
            throw e;
        }
    }