我一直在尝试找到最好的方法来做到这一点,我曾想过提取 .jar 的内容,然后将文件移动到目录中,然后将其作为 jar 放回。我不确定是最好的解决方案或我将如何做到这一点。我看过 DotNetZip 和 SharpZipLib 但不知道该使用哪一个。
如果有人能给我一个关于如何做到这一点的代码链接,我将不胜感激。
我一直在尝试找到最好的方法来做到这一点,我曾想过提取 .jar 的内容,然后将文件移动到目录中,然后将其作为 jar 放回。我不确定是最好的解决方案或我将如何做到这一点。我看过 DotNetZip 和 SharpZipLib 但不知道该使用哪一个。
如果有人能给我一个关于如何做到这一点的代码链接,我将不胜感激。
对于DotNetZip ,您可以在此处找到创建 zip 存档和将 zip 存档解压缩到目录中的非常简单的 VB.NET 示例。请记住使用扩展名.jar保存压缩文件。
对于SharpZipLib ,这里有一些更全面的存档创建和提取示例。
如果这些库都无法提取完整的 JAR 存档,您还可以考虑访问更成熟的压缩软件,例如7-zip,或者使用它作为单独的进程启动它,Process.Start
或者使用它的 COM 接口来访问相关方法7za.dll
. _ 更多关于 COM 使用的信息可以在这里找到。
我认为您正在使用 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;
}
}