如何在iOS中解压缩时列出未知文件?

时间:2014-01-21 07:31:32

标签: ios file-upload path unzip ssziparchive

我已经开始使用ZipArchive了,因为我有一个测试应用程序,可以显示内容经常发生变化的服务器上的图像。我希望应用程序排序和显示图像,而不需要新的图像名称的明确列表。 (或者我也应该在压缩文件中包含一个包含新图像名称的XML文档。)无论哪种方式,我现在在向服务器上的zip文件添加已知图像并在服务器中找到它时遇到问题。应用

  

原始zipfile.zip文件有2个文件:photo.png和text.txt

有效。所以我下载了zipfile.zip并将其上传到我的服务器。当然,它仍然有用。 然后我解压缩它,为它添加了一个新图像,并在我的服务器上重新压缩它。

  

更新的zipfile.zip现在有3个文件:photo.png,myphoto.png和text.txt

我添加的图片myphoto.png无法找到。我错过了什么?

- (void) viewDidAppear:(BOOL)animated {
   [super viewDidAppear:animated];

   dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
      NSURL *url = [NSURL URLWithString:@"http://www.icodeblog.com/wp-content/uploads/2012/08/zipfile.zip"];
      NSError *error = nil;
      NSData *data = [NSData dataWithContentsOfURL:url options:0 error:&error];

      if(!error) {
          NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
          NSString *cachePath = [paths objectAtIndex:0];
          NSString *zipPath = [cachePath stringByAppendingPathComponent:@"zipfile.zip"];
          [data writeToFile:zipPath options:0 error:&error];
          if(!error) {
              ZipArchive *za = [[ZipArchive alloc] init];
              if ([za UnzipOpenFile: zipPath]) {
                  BOOL ret = [za UnzipFileTo: cachePath overWrite: YES];
                  if (NO == ret){
                  }
                  [za UnzipCloseFile];

                  //  NSString *imageFilePath=[cachePath stringByAppendingPathComponent:@"photo.png"];
                  NSString *imageFilePath=[cachePath stringByAppendingPathComponent:@"myphoto.png"];

                  NSData *imageData = [NSData dataWithContentsOfFile:imageFilePath options:0 error:nil];
                  if (imageData) {
                      NSLog(@"found data");
                  } else {
                      NSLog(@"no data");
                  }
                  UIImage *img = [UIImage imageWithData:imageData];

                  NSString *textFilePath = [cachePath stringByAppendingPathComponent:@"text.txt"];
                  NSString *textString = [NSString stringWithContentsOfFile:textFilePath encoding:NSASCIIStringEncoding error:nil];

                  dispatch_async(dispatch_get_main_queue(), ^{
                      self.imageView.image = img;
                      self.label.text = textString;
                  });
              }
        } else {
                NSLog(@"Error saving file %@",error);
            }
        } else {
            NSLog(@"Error downloading zip file: %@", error);
        }
    });
}

当我运行它时,寻找我添加的图像,它返回“无数据”。为什么?更大的问题是:我可以在我的iOS应用程序中列出解压缩文件的内容吗?

  

我使用this question启动了此项目,其中提到了此代码:SSZipArchive。效果很好。

1 个答案:

答案 0 :(得分:0)

我已经测试了你的代码......并且对我来说工作正常... 主要变化: 代替:

ZipArchive *za = [[ZipArchive alloc] init];
              if ([za UnzipOpenFile: zipPath]) {
                  BOOL ret = [za UnzipFileTo: cachePath overWrite: YES];
                  if (NO == ret){
                  }
                  [za UnzipCloseFile];

我正在使用

  

[SSZipArchive unzipFileAtPath:zipPath toDestination:cachePath];

您可以列出目录的内容(解压后):

 NSArray * directoryContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:cachePath error:&error];
                NSLog(@"DIR folder : %@",directoryContents);

您可以根据代码https://dl.dropboxusercontent.com/u/19438780/testSSZipArchive.zip

在此处查看我的演示项目

更新

使用我的zip文件进行测试:

(
    "__MACOSX",
    "Archive.zip",
    "error feedly.txt",
    "image1.jpg",
    "image2.jpg",
    "image3.jpg",
    "image4.jpg",
    "Tony-M.testSSZipArchive"
)