我在iOS上的App包中有文件。如何将其移至Document
文件夹?
这可以通过一些配置来完成,还是我需要为它制作自定义代码?
我的意思是自定义代码:
Document
文件夹。答案 0 :(得分:1)
请查看NSFileManager
,以便您根据需要复制文件系统中的文件。如果复制的文件未标记为不备份到iCloud,您应该知道Apple 会拒绝您的应用。
我使用以下方法将sqlite数据库从bundle复制到文件夹;它应该适用于您的目的,只需稍加修改。
+ (void)copyBundleFileToStoresDirectory:(NSString *)filename
{
NSError *error;
NSURL *fileURL = [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:filename ofType:nil]];
NSURL *pathURL = [SVOFileSystemMethods documentsSubdirectory:@"Stores" skipBackup:YES];
if (fileURL)
{
if([[NSFileManager defaultManager] copyItemAtURL:fileURL toURL:pathURL error:&error])
{
// NSLog(@"File successfully copied");
}
else
{
[[[UIAlertView alloc]initWithTitle:NSLocalizedString(@"error", nil) message: NSLocalizedString(@"Failed to copy database from bundle.", nil)
delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", nil) otherButtonTitles:nil] show];
NSLog(@"Error description-%@ \n", [error localizedDescription]);
NSLog(@"Error reason-%@", [error localizedFailureReason]);
}
}
}
+ (NSURL *) documentsSubdirectory:(NSString *)subdirectoryName skipBackup:(BOOL) skipBackup
{
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder
NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:subdirectoryName]; //untested change here -- was literal @"/Stores"
if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath])
{
[[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:YES attributes:nil error:&error]; //Create folder
NSURL *finalURL = [NSURL fileURLWithPath:dataPath];
if (skipBackup)
[SVOFileSystemMethods addSkipBackupAttributeToItemAtURL:finalURL]; // flag to exclude from backups.
return finalURL;
}
else
return [NSURL fileURLWithPath:dataPath]; // already existed
}
//
// flags URL to exclude from backup
//
+ (BOOL) addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
NSError *error = nil;
BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES]
forKey: NSURLIsExcludedFromBackupKey error: &error];
if(!success)
{
NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
}
return success;
}
答案 1 :(得分:1)
根据我的理解,您无法将文件从应用程序包“移动”到应用程序目录,因为这需要从包中删除它们。假设您的代码设置正确,您将获得拒绝访问权限。
然而,你可以“复制”文件,因为它只是一个阅读。
在我的情况下,我有一大堆文件,我想移动到应用程序的库目录,但无法。此外,由于文件数量的原因,复制操作成本太高。
在这种情况下,我更改了app逻辑以首先检查“新鲜”信息(我将保存到Library文件夹),&如果不存在,则返回App包以查找该文件的旧/原始副本。