【问题标题】:NSFileManager createDirectoryAtPath:withIntermediateDirectories: Not creating directories or creating errorsNSFileManager createDirectoryAtPath:withIntermediateDirectories: 不创建目录或创建错误
【发布时间】:2012-02-02 19:58:44
【问题描述】:

在我的应用中,当用户进行应用内购买时,应用需要下载一个 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");
}

这里是日志文件输出的相关sn-p:

    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 文档,这是应该在日志中输出的内容,但是,没有创建文件夹。

编辑:修复了不使用文档的问题,仍然存在与编辑前相同的问题。

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

【问题讨论】:

    标签: objective-c ios cocoa nsfilemanager


    【解决方案1】:

    您不应该写入应用程序包本身。试试这个:

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

    【讨论】:

    • 我修复了“文档”文件夹问题。但该应用仍然没有创建任何目录,也没有给我任何错误。
    • 您实际上并没有解决问题。现在您只需写入应用程序包的子文件夹,称为文档。您根本不应该写入以[[NSBundle mainBundle] bundlePath] 开头的路径。
    • 完美。这行得通!谢谢!不过有一个问题,我在 NSBundle 中使用的第一种方法,您的代码返回相同的路径。为什么这个有效而第一个无效。
    • 它没有返回相同的路径。如果您仔细看,您会注意到之前的路径包括应用程序包 (WhatsMyStageOn.app) 本身。应该不会了。很高兴你成功了!
    【解决方案2】:

    我认为您无法直接在 WhatsMyStageOn.app/ 中创建目录,请尝试在您的 Documents 目录中创建它们。

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

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

    【讨论】:

    • 哎呀,我怎么没看到。我修复了文件问题。现在将文件夹“文档”添加到每个日志中。但它仍然无法正常工作,或抛出任何错误。
    猜你喜欢
    • 2012-05-31
    • 1970-01-01
    • 2011-03-27
    • 2015-01-11
    • 2013-01-09
    • 2015-04-01
    • 2014-06-06
    • 1970-01-01
    • 2021-12-15
    相关资源
    最近更新 更多