我正在尝试将文件从iCloud容器复制到我的应用缓存目录。我一直在我的日志中收到The operation couldn’t be completed. (Cocoa error 512.)
,这是一个非常广泛的错误,意思是NSFileWriteUnknownError
,或写入失败,iOS不知道原因。
以下是NSMetadataQuery
完成并在iCloud中具有文件名的代码。我将简要介绍下面的代码。
- (void)loadData:(NSMetadataQuery *)query {
NSArray *cache = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[cacheDirectory stringByAppendingString:@"/issues"] error:NULL];
for (NSMetadataItem *item in [query results]) {
NSURL *name = [item valueForAttribute:NSMetadataItemURLKey];
NSString *nameString = [item valueForAttribute:NSMetadataItemPathKey];
NSError *error;
NSURL *cacheURL = [NSURL fileURLWithPath:cacheDirectory];
NSURL *destination = [cacheURL URLByAppendingPathComponent:[NSString stringWithFormat:@"issues/%@", [[nameString stringByDeletingLastPathComponent] lastPathComponent]] isDirectory:YES];
[[NSFileManager defaultManager] copyItemAtURL:[name URLByDeletingLastPathComponent] toURL:destination error:&error];
}
}
}
此应用程序同步报纸问题。在iCloud文档容器中,有包含数据的文件夹(一个文件夹可以是5.1.12
),每个文件夹中都有一个PDF文件,其中相同名称(5.1.12.pdf
)
知道为什么会这样吗?谢谢你的帮助。
iCloud: file://localhost/private/var/mobile/Library/Mobile%20Documents/AppBundleID/Documents/5.3.12/
Local: file://localhost/var/mobile/Applications/F91E115B-ECED-403E-AB61-41F7A99EF928/Library/Caches/issues/5.3.12/
答案 0 :(得分:2)
当iCloud将文件同步到iOS设备时,它会首先在应用容器中创建一个空的无数据文件,以通知您有可用的文件。这是您NSMetadataQuery
报告的内容。
如果您查看NSMetadataItem
的其他键,您可能会注意到它表示您的商品尚未下载。
在复制该文件或打开文件之前,您必须要求iCloud下载该文件。在项目的路径上进行协调读取(正如您应该在任何打开或复制操作中进行的那样)将隐式下载文件。
答案 1 :(得分:2)
已解决!
如果文件已存在,copyItemAtURL将返回错误。大多数情况下,您需要制作类似持久性存档的内容,并使用新更改来覆盖文件。
使用类似的东西将文件写入iCloud
BYTE *data = NULL;//Put your file data in here
int FileSize = 0;//replace with your file size
NSData *myData = [[NSData alloc] initWithBytes:data length:FileSize];
[myData writeToFile:[FileURL path] atomically:YES];
答案 2 :(得分:0)
使用断点和/或NSLog逐步执行代码。可能是因为逻辑错误没有返回您想要的目录路径。