0

我一直在尝试找到最好的方法来做到这一点,我曾想过提取 .jar 的内容,然后将文件移动到目录中,然后将其作为 jar 放回。我不确定是最好的解决方案或我将如何做到这一点。我看过 DotNetZip 和 SharpZipLib 但不知道该使用哪一个。

如果有人能给我一个关于如何做到这一点的代码链接,我将不胜感激。

4

2 回答 2

0

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

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

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

于 2012-08-02T14:47:06.873 回答
0

我认为您正在使用 Minecraft 1.3.1 不是吗?如果是的话,zip 中包含一个名为 aux.class 的文件,不幸的是,它是 Windows 中的保留文件名。我一直在尝试自动化修改过程,同时自己操作 jar 文件,但收效甚微。我尚未探索的唯一选择是找到一种方法将 jar 文件的内容提取到临时位置,同时注意该异常。发生时,将文件重命名为临时名称,提取并继续。然后在重新创建 zip 文件时,为该文件在存档中指定原始名称。根据我自己的经验,SharZipLib 不能很好地完成您需要的工作,或者至少我不知道如何做。我建议改用 Ionic Zip (Dot Net Zip),并在有问题的文件上尝试重命名路由。此外,我还发布了一个关于此的问题。你可以看到我走了多远将 zip 条目提取到另一个 Zip 文件

编辑 - 我测试了 .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;
        }
    }
于 2012-08-08T01:49:05.333 回答