1

我需要从.jar文件中删除一个文件夹,但将其视为带有 sharpziplib的.zip文件。有什么办法吗?

我之前尝试过使用sharpziplib “解压缩” .jar文件,然后将其删除并重新压缩,但无济于事——更不用说这样做会慢得多。

如何直接删除文件夹?

4

5 回答 5

0

AJAR类似于ZIP文件。AJAR是一个Java ARchive。就像您无法在不解压缩文件的情况下直接删除文件/文件夹一样ZIP,您必须解压缩JAR文件才能访问它。

于 2013-07-28T04:33:34.937 回答
0

我不熟悉 SharpZibLib,但我之前使用过 DotNetZip,您可以将 zip 文件提取到特定文件夹并删除文件/文件夹,然后将内容重新压缩到新位置。

是的,如果要删除并重新压缩它,则需要完全提取它。

于 2013-07-28T04:38:39.113 回答
0

我建议这样做,当且仅当,你真的知道你在做什么,你真的需要这个,你知道那些jars 的命运将是什么。

正如其他用户所指出的,jar 是一种与 zip 文件或通用压缩存档非常相似的文件格式,主要区别在于安全机制和清单的存在,问题是 jar 并不真正需要这个最后 2 件存在或被接受为 jar,但是如果您只是删除要从 jar 中删除的内容,则可以破坏所有散列和清单(如果它是带有清单的 jar),最后您的 jar可能会没用。

于 2013-07-28T04:48:10.833 回答
0

那么使用DotNetZip(它也可以在nuget上使用)你可以做这样的事情(或者至少它应该给你这个想法):

// define your paths accordingly
string unpackDir = "C:\\unpackDir";
string originalJarFilePath = "C:\\...\\your_file.jar";
string destinationJarFilePath = "C:\\...\\shiny_new_archive.jar";

// unpack
using (var jar = ZipFile.Read(originalJarFilePath))
{
    if (!Directory.Exists(unpackDir))
    {
        Directory.CreateDirectory(unpackDir);
    }
    jar.ExtractAll(unpackDir, ExtractExistingFileAction.OverwriteSilently);
}

// make a new jar excluding the files you don't want
using (var editedJar = new ZipFile())
{
    foreach (string file in Directory.GetFiles(unpackDir).Where(file => file != "IDontWantThisOne.txt"))
    {
        editedJar.AddFile(file);
    }
    editedJar.Save(destinationJarFilePath);
}

我希望这可以帮助你。

于 2013-07-28T04:55:08.850 回答
0

嗯,与流行的看法相反,我不需要解压缩 .jar 文件。我只需要这样做(使用 dotnetzip btw)-

//Code to delete META-INF folder
using (ZipFile zip = ZipFile.Read(jarFile))
{
    List<string> files = zip.EntryFileNames.ToList<string>();
    List<string> delete = new List<string>();
    for (int i = 0; i < files.Count; i++)
    {
        if (files[i].Contains("META-INF"))
        {
            delete.Add(files[i]);
        }
    }
zip.RemoveEntries(delete);
zip.Save();
}
MessageBox.Show("Success!", "Success", MessageBoxButtons.OK, MessageBoxIcon.None);
于 2013-08-08T04:11:44.030 回答