删除文件夹从的.jar,同时把一个Zip(Delete Folder From .Jar While

2019-09-28 03:41发布

我需要从一个.jar文件删除文件夹,而是把它当作与sharpziplib .zip文件。 有没有办法这样做呢?

我以前曾尝试使用sharpziplib来“解压”的.jar文件,然后将其删除,并重新压缩,但没有利用-更何况这是要慢得多这样做的。

我怎样才能直接删除该文件夹?

Answer 1:

一个JAR类似于ZIP文件。 一个JAR是一个Java ARchive 。 就像你不能直接删除文件/文件夹,而不拆包ZIP文件,你必须解开一个JAR文件来访问它。



Answer 2:

我不熟悉SharpZibLib,但我已经使用DotNetZip之前,在那里你可以把zip文件解压到一个特定的文件夹,删除文件/文件夹,然后在新位置重新压缩的内容。

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



Answer 3:

我建议,如果做到这一点,当且仅当你真的知道你在做什么,你真的需要这个,你就知道会是怎样的命运jar秒。

从其他用户指出了一个罐子是一个非常类似的文件格式的压缩文件或通用压缩归档,主要的差异是一种安全机制和清单的情况下,事情是,一个罐子并不真正需要这个最后2个存在,或被接受为一个罐子,但如果你只是删除您想从罐子中删除,你可以打破所有的散列和清单(如果它是一个明显的罐子)什么,到底你的罐子可能是无用的。



Answer 4:

那么使用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);
}

我希望这可以帮助你。



Answer 5:

呵呵,流行的看法相反,我并不需要解压.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);


文章来源: Delete Folder From .Jar While Treating as a Zip