NSFileManager创建文件夹(Cocoa错误513.)

时间:2010-08-09 11:11:45

标签: iphone nsfilemanager

我正在尝试在我的应用程序的/ sounds文件夹中创建一个文件夹。

-(void)productPurchased:(UAProduct*) product {
    NSLog(@"[StoreFrontDelegate] Purchased: %@ -- %@", product.productIdentifier, product.title);

    NSFileManager *manager = [NSFileManager defaultManager];
    NSString *bundleRoot = [[NSBundle mainBundle] bundlePath];

    NSError *error;

    NSString *dataPath = [NSString stringWithFormat:@"%@/sounds/%@", bundleRoot, product.title];

    if (![manager fileExistsAtPath:dataPath isDirectory:YES]) {
        [manager createDirectoryAtPath:dataPath withIntermediateDirectories:YES attributes:nil error:&error];
        NSLog(@"Creating folder");
    }

    NSLog(@"%@", error);
}

但是我收到了这个错误:

Error Domain=NSCocoaErrorDomain Code=513 "The operation couldn’t be completed. (Cocoa error 513.)" UserInfo=0x175120 {NSFilePath=/var/mobile/Applications/D83FDFF9-2600-4056-9047-05F82633A2E4/App.app/sounds/Test Tones, NSUnderlyingError=0x117520 "The operation couldn’t be completed. Operation not permitted"}

我做错了什么? 感谢。

4 个答案:

答案 0 :(得分:47)

如果您在错误域NSCocoaErrorDomain上搜索Google,则会发现代码513会转换为错误NSFileWriteNoPermissionError

这为您提供了解决此问题的关键线索:

  

This is the bundle directory containing the application itself. Because an application must be signed, you must not make changes to the contents of this directory at runtime. Doing so may prevent your application from launching later.

具体来说,您无法修改已编译应用程序的文件夹文件夹的内容。这是因为bundle是已编译的应用程序。

当您最终通过iTunes App Store分发应用程序时,该应用程序具有验证应用程序内容的数字签名。此签名在编译时生成。

如果您尝试在编译后更改捆绑包,则应用程序会更改,并且数字签名不再有效。这使应用程序无效 - 谁知道那里有什么代码,对吧? - 最终用户将无法运行它。因此,如果您尝试修改捆绑包,Apple已设置iOS以引发错误。

您的应用可以写入one of three accepted app-specific foldersDocumentsTempCache,而不是写入套装。最有可能的是,您需要写入Documents文件夹。

这些文件夹只能供您的应用访问。没有其他应用可以访问这些文件夹的内容。 (同样,您的应用无法访问其他应用的文件夹。)

您可以设置应用以允许最终用户通过iTunes管理对文件数据的访问,desktop file sharing support

答案 1 :(得分:6)

这是因为您不应该在运行时修改应用程序包。相反,您应该在其他位置添加资源。

编辑:
您看到的错误很可能是因为您无法写入捆绑包。

答案 2 :(得分:4)

使用 Log 库时遇到同样的问题。最后,它是路径格式问题。检查dataPath格式。如果是Case 1,则有效。就我而言,它是Case 2,所以我无法创建目录。

// Case 1
/var/mobile/Containers/Data/Application/5FB2CD2D-91DC-4FB2-8D6F-06369C70BB4A/Library/Caches/AppLogs

// Case 2, invalid format
file://var/mobile/Containers/Data/Application/5FB2CD2D-91DC-4FB2-8D6F-06369C70BB4A/Library/Caches/AppLogs

如果dataPath有前缀,例如:file://,则无效

对于NSURL的实例,path将返回类似case 1的字符串,而absolutePath将返回类似case 2的字符串。

答案 3 :(得分:0)

在我的情况下,我仍然不太清楚513错误的含义,但是当我尝试使用[NSFileHandle fileHandleForReadingFromURL:theUrl error:&err ]读取打开的文件URL时,我得到了它。

我从this answer意识到,在iOS 13上,我现在需要使用startAccessingSecurityScopedResource来访问在应用程序中打开的外部文件。当我按如下方式包装文件调用时,错误513不再发生:

if( [myURL startAccessingSecurityScopedResource] ) 
{
    NSFileHandle* myFile = [NSFileHandle fileHandleForReadingFromURL:myURL error:&err ];
    // ...Do file reads here...
    [theUrl stopAccessingSecurityScopedResource];
}