如何在另一个zip文件中读取zip文件的zip条目,c#或vb.net

时间:2016-06-19 01:50:20

标签: c# asp.net .net vb.net zip

虽然使用java库(Read a zip file inside zip file)对此问题有回应,但我无法在c#或vb.net中的任何位置找到此示例。

我必须为客户端做的是使用.NET 4.5 ZipArchive库来遍历特定条目的zip文件。在有人要求之前,客户拒绝允许我使用dotnetzip,因为他的首席架构师有使用该库的经验,并表示在实际应用程序中使用它太麻烦了。他向我指出了一对夫妇,无论如何我认为并不重要!

如果我有一个zip文件,它本身包含其他zip文件,我需要一种打开内部zip文件的方法,并阅读该zip文件的条目。最后,我还必须实际打开拉链的zip拉链条目,但是现在我必须能够获得内部zip文件的zipentries。

这是我到目前为止所拥有的:

public string PassThruZipFilter(string[] sfilters, string sfile, bool buseregexp, bool bignorecase, List<ZipArchiveZipFile> alzips)
{
  bool bpassed = true;
  bool bfound = false;
  bool berror = false;
  string spassed = "";
  int ifile = 0;
  try
  {
    ZipArchive oarchive = null; ;
    int izipfiles = 0;
    if (alzips.Count == 0)
    {
      oarchive = ZipFile.OpenRead(sfile);
      izipfiles = oarchive.Entries.Count;
    }
    else
    {
      //need to dig into zipfile n times in alzips[i] where n = alzips.Count
      oarchive = GetNthZipFileEntries(alzips, sfile); <------ NEED TO CREATE THIS FUNCTION!
      izipfiles = oarchive.Entries.Count;
    }
    while (((ifile < izipfiles) & (bfound == false)))
    {
      string sfilename = "";
      sfilename = oarchive.Entries[ifile].Name;
      //need to take into account zip files that contain zip files...
      bfound = PassThruFilter(sfilters, sfilename, buseregexp, bignorecase);
      if ((bfound == false) && (IsZipFile(sfilename)))
      {
        //add this to the zip stack
        ZipArchiveZipFile ozazp = new ZipArchiveZipFile(alzips.Count, sfile, sfilename);
        alzips.Add(ozazp);
        spassed = PassThruZipFilter(sfilters, sfilename, buseregexp, bignorecase, alzips);
        if (spassed.Equals(sISTRUE))
        {
          bfound = true;
        }
        else
        {
          if (spassed.Equals(sISFALSE))
          {
            bfound = false;
          }
          else
          {
            bfound = false;
            berror = true;
          }
        }
      }
      ifile += 1;
    }
  }
  catch (Exception oziperror)
  {
    berror = true;
    spassed = oziperror.Message;
  }
  if ((bfound == false))
  {
    bpassed = false;
  }
  else
  {
    bpassed = true;
  }
  if (berror == false)
  {
    spassed = bpassed.ToString();
  }
  return (spassed);
}

所以我必须创建的函数是&#39; GetNthZipFileEntries(List,sfile)&#39;,其中ZipFileZipEntry只是一个包含int索引,字符串szipfile,string szipentry的结构。

我无法弄清楚如何读取zip文件中的zip文件(或者gd禁止,zip文件中的zip文件中的zip文件......&#39; PassThruZipFilter是里面的函数递归函数)使用.NET 4.5。显然微软会这样做,因为你可以在资源管理器的zip文件中打开一个zip文件。非常感谢任何可以提供帮助的人。

所以,我真的需要你的帮助,如何在.NET 4.5中的zip文件中打开zip文件,而无需写入磁盘。网上没有我为此特定目的找到的例子。我可以找到大量阅读zip文件条目的例子,但这并没有帮助。 要清楚,我不能用硬盘写任何东西。我可以使用内存流,但这是我能做的范围。 我无法使用dotnetzip库,所以使用它的任何评论都没有帮助,但我当然感谢任何帮助。我可以使用像Sharp zip libs这样的另一个库,但是我必须说服客户说.NET 4.5是不可能的。

1 个答案:

答案 0 :(得分:0)

将ZipArchiveEntry标识为Zipfile后,可以在条目上调用class InputViewController1: UIViewController, UITextFieldDelegate { @IBOutlet weak var questionLabel: UILabel! @IBOutlet weak var correctAnswerLabel: UILabel! @IBOutlet weak var inputTextField: UITextField! @IBOutlet weak var nextButton: UIButton! @IBAction func nextButtonPressed(sender: UIButton) { } var enteredAnswer: String? var correctAnswer = "Small" override func viewDidLoad() { super.viewDidLoad() NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(InputViewController1.keyboardWillShow(_:)), name: UIKeyboardWillShowNotification, object: nil) NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(InputViewController1.keyboardWillHide), name: UIKeyboardWillHideNotification, object: nil) inputTextField.addTarget(self, action: #selector(InputViewController1.textDidChange(_:)), forControlEvents: .EditingChanged) inputTextField.delegate = self nextButton.alpha = 0.0 titlesForLabels() } func titlesForLabels() { questionLabel.text = "What is the size of the lesion(s)?" correctAnswerLabel.text = correctAnswer correctAnswerLabel.hidden = true inputTextField.text = nil inputTextField.enabled = true } func keyboardWillShow(notification: NSNotification) { let userInfo = notification.userInfo! let keyboardFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue() UIView.animateWithDuration(0.1, animations: { self.view.frame.origin.y = -keyboardFrame.size.height }) } func keyboardWillHide() { UIView.animateWithDuration(0.1, animations: { self.view.frame.origin.y = 0 }) } func textFieldShouldReturn(textField: UITextField) -> Bool { textField.resignFirstResponder() enteredAnswer = textField.text checkForCorrectAnswer() return true } func checkForCorrectAnswer() { if enteredAnswer!.lowercaseString == correctAnswer.lowercaseString { correctAnswerLabel.textColor = UIColor.greenColor() UIView.animateWithDuration(0.5, animations: { self.nextButton.alpha = 1.0 }, completion: nil) correctAnswerLabel.text = "Correct!" } else { print("Wrong Answer") correctAnswerLabel.textColor = UIColor.redColor() correctAnswerLabel.text = "Incorrect!" } correctAnswerLabel.hidden = false } func textDidChange(sender: UITextField) { enteredAnswer = inputTextField.text correctAnswerLabel.textColor = UIColor.redColor() correctAnswerLabel.text = "Incorrect!" if enteredAnswer!.lowercaseString != correctAnswer.lowercaseString { UIView.animateWithDuration(0.5, animations: { self.nextButton.alpha = 0.0 }, completion: nil) } } } 方法以获取Open。然后,该流可用于创建新的Stream

以下代码演示了列出嵌套Zip存档的所有条目和子条目。

ZipArchive