1

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

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

有问题的路径看起来像这样:/Library/Caches/_0_0_0_0_1100_1149.jpg我也尝试过/Documents/....

有没有办法真正得到错误代码或不仅仅是成功/失败?

4

4 回答 4

4

模拟器不会模拟在设备上强制执行的文件系统沙盒。您可以在 sim 上的任何位置写入,但在设备上写入指定目录之一以外的任何位置都会失败。

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

于 2013-09-16T23:58:01.343 回答
2

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

NSString* pathRoot = NSSearchPathForDirectoriesInDomains( NSCachesDirectory, NSUserDomainMask, YES )[0];
于 2013-09-16T23:15:55.793 回答
1

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

于 2013-09-16T23:06:47.393 回答
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;
            }
        }
    }
}
于 2013-09-17T05:55:34.833 回答