我正在尝试将一些图像数据写入iOS上的磁盘,但是当它在模拟器中完美运行时,当我在真正的iPad上尝试它时它会失败(返回0)。
BOOL success = [[NSFileManager defaultManager] createFileAtPath:filePath contents:imageData attributes:nil];
相关路径如下所示:/Library/Caches/_0_0_0_0_1100_1149.jpg
我还试过/Documents/...
。
有没有办法真正获得错误代码或超出成功/失败的东西?
答案 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;
}
}
}
}