NSFileManager createFileAtPath在模拟器中工作但在设备上失败

时间:2013-09-16 22:54:27

标签: ios ipad nsfilemanager

我正在尝试将一些图像数据写入iOS上的磁盘,但是当它在模拟器中完美运行时,当我在真正的iPad上尝试它时它会失败(返回0)。

BOOL success = [[NSFileManager defaultManager] createFileAtPath:filePath contents:imageData attributes:nil];

相关路径如下所示:/Library/Caches/_0_0_0_0_1100_1149.jpg我还试过/Documents/...

有没有办法真正获得错误代码或超出成功/失败的东西?

4 个答案:

答案 0 :(得分:4)

模拟器不会模拟在设备上强制执行的文件系统的沙盒。你可以在sim上的任何地方写,但是在任何地方写一个设备,但你指定的目录之一会失败。

我猜你的路径是以某种方式形成的。尝试记录你的路径以及你从NSCachesDirectory获得的路径(如你的第二篇文章所示)。它们几乎肯定是不同的。

答案 1 :(得分:2)

原则上你必须以编程方式获取目录。 iOS文件系统没有像我预期的那样沙箱化。

NSString* pathRoot = NSSearchPathForDirectoriesInDomains( NSCachesDirectory, NSUserDomainMask, YES )[0];

答案 2 :(得分:1)

如果您正在编写图像数据,为什么不尝试通过NSData的[writeToFile: options: error:] method进行编写,“错误”参数可以为您提供一些非常有用的提示,说明您的文件没有写入的原因。

答案 3 :(得分:0)

这是不合逻辑的:

if ( !( [ fileManager copyItemAtPath:resourceDBFolderPath toPath:documentDBFolderPath error:&error ])) 

您正在检查方法是否存在,而不是成功!!

我有一些我在项目中使用的相关代码,我希望它可以帮助你某种方式:

-(void)testMethod {

    NSString *resourceDBFolderPath;

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory,
                                                         NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *documentDBFolderPath = [documentsDirectory stringByAppendingPathComponent:@"plans.gallery"];
    BOOL success = [fileManager fileExistsAtPath:documentDBFolderPath];

    if (success){
        NSLog(@"Success!");
        return;
    } 
    else {
        //simplified method with more common and helpful method 
        resourceDBFolderPath = [[NSBundle mainBundle] pathForResource:@"plans" ofType:@"gallery"];

        //fixed a deprecated method
        [fileManager createDirectoryAtPath:documentDBFolderPath withIntermediateDirectories:NO attributes:nil error:nil];

        [fileManager copyItemAtPath:resourceDBFolderPath toPath:documentDBFolderPath           
                              error:&error];

        //check if destinationFolder exists
        if ([ fileManager fileExistsAtPath:documentDBFolderPath])
        {
            //FIXED, another method that doesn't return a boolean.  check for error instead
            if (error)
            {
                //NSLog first error from copyitemAtPath
                NSLog(@"Could not remove old files. Error:%@", [error localizedDescription]);

                //remove file path and NSLog error if it exists.
                [fileManager removeItemAtPath:documentDBFolderPath error:&error];
                NSLog(@"Could not remove old files. Error:%@", [error localizedDescription]);
                return;
            }
        }
    }
}