【问题标题】:Best way to extract .zip and put in .jar提取 .zip 并放入 .jar 的最佳方法
【发布时间】:2012-08-02 14:06:06
【问题描述】:

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

如果有人能给我一个链接到如何执行此操作的代码,将不胜感激。

【问题讨论】:

  • 你的意思是你的 .zip 文件真的是一个 .jar 档案吗?然后将文件扩展名交换为 .jar 就足够了。
  • 嗯,基本上是 VB.NET 程序,它下载一个 .ZIP,其中包含需要进入用户 PC 上的 .jar 文件的文件。所以我基本上需要一种方法来提取 .ZIP 并将内容放入 .JAR

标签: vb.net dotnetzip sharpziplib


【解决方案1】:

对于DotNetZip,您可以找到非常简单的 VB.NET 示例,这些示例既可以创建 zip 存档,也可以将 zip 存档解压缩到目录here。只需记住使用扩展名 .jar 保存压缩文件。

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

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

【讨论】:

  • 在解压之前将 .jar 的文件扩展名更改为 .zip,这样就可以了。
  • 我现在已经尝试了很多,我可以得到它来提取一些 .jar,但它一直给我错误“FileStream 不会打开 Win32 设备,如磁盘分区和磁带驱动器。避免在路径中使用“\\.\”。”我似乎无法修复。
  • @user1378127 我添加了其他信息。我建议您先试用 SharpZipLib 看看它是否能更好地处理 JAR 内容。如果这不起作用,请下载 7-Zip 并验证其 GUI 是否能够正确打开您的 JAR 文件,然后尝试合并对 7za.exe7za.dll 的访问i> 来自您的代码。
【解决方案2】:

我认为您正在使用 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;
        }
    }

【讨论】:

    猜你喜欢
    • 2011-01-08
    • 1970-01-01
    • 2011-08-04
    • 2019-01-12
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多