【问题标题】:Delete Folder From .Jar While Treating as a Zip将文件夹从 .Jar 中删除,同时将其视为 Zip
【发布时间】:2013-07-28 04:24:01
【问题描述】:

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

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

如何直接删除文件夹?

【问题讨论】:

  • 我也可以使用dotnetzip。

标签: c# sharpziplib


【解决方案1】:

JAR 类似于 ZIP 文件。 JARJava ARchive。就像不解压ZIP文件无法直接删除文件/文件夹一样,您必须解压JAR文件才能访问它。

【讨论】:

  • 我该怎么做?通过“解压”整个罐子?
  • 是的,你已经“解压”了 jar。为什么不使用您正在使用的库或其他 ZIP 文件库进行解包/重新打包?如果您对库有问题,请发布该问题,但您无法像访问文件系统文件/文件夹一样从 JAR 文件访问文件/文件夹,而无需先解包。
  • stackoverflow.com/questions/9855155/… 那他为什么说有可能呢?
  • 因为正在可能正在解压缩。你需要这个库,就像我之前的评论一样,它可能有解包、操作和重新打包的方法。该人正在使用 DotNetZip 库。
  • 没有,我只是用了removeentry方法,不需要解压。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案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);
      }
      

      希望对你有帮助。

      【讨论】:

      • 当我尝试提取 jar 文件时,它返回一个错误。 hastebin.com/xigiluweko.tex
      • 因为 zip 包含一个名为 aux.class 的文件,这是 Windows 禁止使用的文件名。
      【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多