虽然使用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是不可能的。
答案 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