我一直在尝试找到最好的方法来实现这一点我想到了解除.jar的内容然后将文件移动到目录中然后将其作为jar放回去。我不确定是最好的解决方案或我将如何做到这一点。我看过DotNetZip& SharpZipLib但不知道使用什么。
如果有人可以给我一个关于如何执行此操作的代码的链接,我们将不胜感激。
答案 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;
}
}