You create a directory with the path fullPath
and then you try to write the file at the same path. Overwriting a directory with a file like this is not possible. Use your cacheDirectory
string to create your directory.
NSKeyedArchiver archiveRootObject keeps returning NO
-
15-01-2022 - |
質問
I've spent the past few hours trying to figure this out, but I've ran out of ideas.
All I'm trying to do is archive an object, but the method archiveRootObject
keeps on returning NO
Here's my code:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cacheDirectory = [paths objectAtIndex:0];
cacheDirectory = [cacheDirectory stringByAppendingPathComponent:@"MyAppCache"];
NSString *fullPath = [cacheDirectory stringByAppendingPathComponent:@"archive.data"];
if(![[NSFileManager defaultManager] fileExistsAtPath:fullPath]){
[[NSFileManager defaultManager] createDirectoryAtPath:fullPath withIntermediateDirectories:YES attributes:nil error:nil];
}
NSArray *array = [NSArray arrayWithObjects:@"hello", @"world", nil];
NSLog(@"Full Path: %@", fullPath);
BOOL res = [NSKeyedArchiver archiveRootObject:array toFile:fullPath];
if(res){
NSLog(@"YES");
}else{
NSLog(@"NO");
}
Every time time I run this, it prints NO
.
Any help would be appreciated!
解決
他のヒント
NSString *cacheDirectory is not a mutable string and after you init it, you attempt to modify it so you are writing to the top-level directory.
For a quick fix, try:
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *documentPath = ([documentPaths count] > 0) ? [documentPaths objectAtIndex:0] : nil;
NSString *documentsResourcesPath = [documentPath stringByAppendingPathComponent:@"MyAppCache"];
NSString *fullPath = [documentsResourcesPath stringByAppendingPathComponent:@"archive.data"];
所属していません StackOverflow