2012-01-04 84 views
4

在我的应用程序,当用户在一个应用程序内购买,应用程序需要下载并解压缩zip文件到应用程序的文件夹。该zip文件下载并可以解压缩。我正在使用Objective Zip来解压档案。问题是,当试图为每个文件创建文件夹路径时,文件夹从不创建,并且没有错误。的NSFileManager createDirectoryAtPath:withIntermediateDirectories:不创建目录或产生错误

这里是哪里出现这种情况的部分一些示例代码:

// Create file manager 
NSFileManager *fileMgr = [NSFileManager defaultManager]; 

//Unzip 
NSString *applicationDocumentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
ZipFile *unzipFile = [[ZipFile alloc] initWithFileName:[applicationDocumentsDir stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.zip",@"Mid America Oireachtas 2011"]] mode:ZipFileModeUnzip]; 
NSArray *infos= [unzipFile listFileInZipInfos]; 
for (FileInZipInfo *info in infos) { 
    //NSLog(@"- %@ %@ %d (%d)", info.name, info.date, info.size, info.level); 

    // Locate the file in the zip 
    [unzipFile locateFileInZip:info.name]; 

    // Expand the file in memory 
    ZipReadStream *read= [unzipFile readCurrentFileInZip]; 
    NSMutableData *data= [[NSMutableData alloc] initWithLength:info.length]; 
    int bytesRead = [read readDataWithBuffer:data]; 
    [read finishedReading]; 
    NSString *appSupportFolder = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 
    NSString *pathfull = [appSupportFolder stringByAppendingPathComponent:info.name]; 
    NSString *path = [[pathfull stringByDeletingLastPathComponent] copy]; 
    NSError *errorw; 
    NSRange range = [path rangeOfString:@"__MACOSX"]; 
    if (range.location == NSNotFound) { 
     NSLog(@"last: %@", [path lastPathComponent]); 
     if ([fileMgr createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&errorw]) { 
      NSLog(@"Create Folder: %@", path); 
      NSLog(@"Directory Win: %@", errorw); 
      if (![[pathfull pathExtension] isEqualToString:@""] && ![[[pathfull lastPathComponent] substringToIndex:1] isEqualToString:@"." ]) { 
       [data writeToFile:pathfull atomically:NO]; 
      } 
     } 
     else { 
      //NSLog(@"Create Folder: %@", path); 
      NSLog(@"Directroy Fail: %@", errorw); 
     } 
    } 
} 

[unzipFile close]; 

//delete zip 
// For error information 
NSError *error; 

if ([fileMgr removeItemAtPath:[applicationDocumentsDir stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.zip",@"Mid America Oireachtas 2011"]] error:&error] == YES) { 
    NSLog(@"File Deleted"); 
} 

//delete zip 
// For error information 
NSError *error; 

if ([fileMgr removeItemAtPath:[applicationDocumentsDir stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.zip",@"My Zip"]] error:&error] == YES) { 
    NSLog(@"File Deleted"); 
} 

下面是从日志文件输出的相关片段:

2012-01-04 17:12:51.509 WhatsMyStageOn[3232:15503] Create Folder: /Users/Brandon/Library/Application Support/iPhone Simulator/5.0/Applications/436C2C49-D79B-4CDA-B0AA-15BB98F6F75E/WhatsMyStageOn.app/ 
    2012-01-04 17:12:51.510 WhatsMyStageOn[3232:15503] Directory Win: (null) 
    2012-01-04 17:12:51.510 WhatsMyStageOn[3232:15503] Create Folder: /Users/Brandon/Library/Application Support/iPhone Simulator/5.0/Applications/436C2C49-D79B-4CDA-B0AA-15BB98F6F75E/WhatsMyStageOn.app/Documents/Mid America Oireachtas 2011 
    2012-01-04 17:12:51.510 WhatsMyStageOn[3232:15503] Directory Win: (null) 
    2012-01-04 17:12:51.510 WhatsMyStageOn[3232:15503] Create Folder: /Users/Brandon/Library/Application Support/iPhone Simulator/5.0/Applications/436C2C49-D79B-4CDA-B0AA-15BB98F6F75E/WhatsMyStageOn.app/Documents 
    2012-01-04 17:12:51.510 WhatsMyStageOn[3232:15503] Directory Win: (null) 
    2012-01-04 17:12:51.511 WhatsMyStageOn[3232:15503] Create Folder: /Users/Brandon/Library/Application Support/iPhone Simulator/5.0/Applications/436C2C49-D79B-4CDA-B0AA-15BB98F6F75E/WhatsMyStageOn.app/Documents/__MACOSX 
    2012-01-04 17:12:51.511 WhatsMyStageOn[3232:15503] Directory Win: (null) 
    2012-01-04 17:12:51.511 WhatsMyStageOn[3232:15503] Create Folder: /Users/Brandon/Library/Application Support/iPhone Simulator/5.0/Applications/436C2C49-D79B-4CDA-B0AA-15BB98F6F75E/WhatsMyStageOn.app/Documents/__MACOSX/Mid America Oireachtas 2011 
    2012-01-04 17:12:51.511 WhatsMyStageOn[3232:15503] Directory Win: (null) 
    2012-01-04 17:12:51.511 WhatsMyStageOn[3232:15503] Create Folder: /Users/Brandon/Library/Application Support/iPhone Simulator/5.0/Applications/436C2C49-D79B-4CDA-B0AA-15BB98F6F75E/WhatsMyStageOn.app/Documents/Mid America Oireachtas 2011 
    2012-01-04 17:12:51.512 WhatsMyStageOn[3232:15503] Directory Win: (null) 
    2012-01-04 17:12:51.544 WhatsMyStageOn[3232:15503] Create Folder: /Users/Brandon/Library/Application Support/iPhone Simulator/5.0/Applications/436C2C49-D79B-4CDA-B0AA-15BB98F6F75E/WhatsMyStageOn.app/Documents/Mid America Oireachtas 2011/Attractions 
    2012-01-04 17:12:51.544 WhatsMyStageOn[3232:15503] Directory Win: (null) 

读的NSFileManager的文件,这是什么应该在日志中输出,但是,没有创建文件夹。

编辑:修正不使用文件问题,仍然有编辑前谴责相同的问题。

编辑:更新代码工作解决方案!

+0

+1的问题标题。 – 2012-01-04 23:55:59

回答

5

你不应该写信给应用程序的包本身。试试这个:

NSString *appSupportFolder = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 
NSString *path = [appSupportFolder stringByAppendingPathComponent:info.name]; 
+0

我修复了“Documents”文件夹问题。但该应用程序仍然没有创建任何目录,或给我任何错误。 – 2012-01-05 00:29:21

+0

虽然你并没有真正解决这个问题。现在您只需写入名为documents的应用程序包的子文件夹即可。您不应该写入以[[[NSBundle mainBundle] bundlePath]开头的路径。 – 2012-01-05 00:47:29

+0

完美。这工作!谢谢!有一个问题,我用NSBundle的第一个方法,你的代码返回相同的路径。为什么这个工作,第一个没有。 – 2012-01-05 01:45:25

3

我不认为你可以直接创建目录WhatsMyStageOn.app/内,尝试创建他们你的文档目录里面。

NSMutableString *path = [info.name mutableCopy]; 
path = [[path stringByDeletingLastPathComponent] mutableCopy]; 
path = [NSMutableString stringWithFormat:@"%@/%@", applicationDocumentsDir, path]; 

您在底部有一行删除文档中的正确文件路径,但原始路径变量指向捆绑目录而不是文档目录。

+0

哎呀,我怎么没有看到。我修复了文档问题。文件夹“文档”现在被添加到每个日志。但它仍然不起作用,或者抛出任何错误。 – 2012-01-04 22:59:03