NSFileManager createDirectoryAtPath: withIntermediateDirectories: не создавать каталоги и не создавать ошибки - PullRequest
4 голосов
/ 05 января 2012

В моем приложении, когда пользователь совершает покупку в приложении, приложение должно загрузить и распаковать zip-файл в папку документов приложения.Файл ZIP загружается и может быть распакован.Я использую Objective Zip , чтобы распаковать архив.Проблема заключается в том, что при попытке создать пути к папкам для каждого файла папки никогда не создаются и ошибки не возникает.

Вот пример кода для раздела, где это происходит:

// 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, это то, что должно выводиться в журнале, но папки не создаются.

РЕДАКТИРОВАТЬ: Исправлена ​​ошибка, из-за которой не использовалась проблема с документами, по-прежнему возникала та же проблема, что и перед редактированием.Обновлен код до рабочего решения!

Ответы [ 2 ]

5 голосов
/ 05 января 2012

Вы не должны писать в пакет приложения.Попробуйте это:

NSString *appSupportFolder = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *path = [appSupportFolder stringByAppendingPathComponent:info.name];
3 голосов
/ 05 января 2012

Я не думаю, что вы можете создавать каталоги непосредственно внутри WhatsMyStageOn.app/, попробуйте создать их внутри вашего каталога документов.

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

У вас есть строка внизу, которая удаляет правильный путь к файлу внутри документов, но исходная переменная пути указывает на каталог пакета, а не на каталог документов.

...