2012-01-04 83 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