2012-01-04 17 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"); 
} 

ここでは、ログファイルからの出力の関連抜粋されています、これはどのようなNSFileManagerのドキュメントを読む

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) 

ですログに出力する必要がありますが、フォルダは作成されません。

編集:ドキュメントの問題を使用しないように修正されましたが、編集前にはまだ問題がありません。

EDIT:コードを作業ソリューションに更新しました!

+0

+1質問のタイトルです。 –

答えて

5

あなたは、アプリケーションのバンドル自体に書き込むべきではありません。これを試してみてください:

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

「Documents」フォルダの問題を修正しました。アプリではまだディレクトリが作成されていないか、エラーが表示されています。 –

+0

あなたは実際に問題を解決しませんでした。これで、ドキュメントと呼ばれるアプリケーションバンドルのサブフォルダに簡単に書き込んでいます。 '[[NSBundle mainBundle] bundlePath]'で始まるパスに書き込むべきではありません。 –

+0

パーフェクト。これはうまくいった!ありがとう! 1つの質問ですが、私がNSBundleで使用した最初のメソッドとコードは同じパスを返します。なぜこれは動作し、最初のものは動作しません。 –

3

あなたはWhatsMyStageOn.app/の中に直接ディレクトリを作成することはできませんが、Documentsディレクトリ内でディレクトリを作成してみてください。

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

あなたは、ドキュメントの内部に正しいファイルパスを削除します下の線が、バンドルディレクトリであなたの元のパス変数の点ではなく、ドキュメントディレクトリを持っています。

+0

おっと、どうして私はそれを見ませんでしたか?私は文書の問題を修正しました。フォルダ「Documents」が各ログに追加されるようになりました。しかし、それはまだ動作していません、または何かエラーを投げる。 –

関連する問題