1

我有一个应用程序,其中有一定数量的 .jpg 图片(大约 300 张)。它们作为开始的东西,因为它们实际上位于互联网中,但显然用户在第一次启动应用程序时不要将它们全部下载,而是将它们预先打包更方便。

每次从服务器获取新信息时,我都需要重写这些图像。显然,我无法触摸应用程序包,所以我看到我的步骤是这样的:

  1. 在应用程序第一次启动时将图像从捆绑包中解压缩到文档目录。
  2. 只能从 Documents Directory 访问它们,而不是从 bundle 访问它们。
  3. 如果有必要,我应该重写它们。

因此我的代码将是统一的,因为我将始终使用相同的路径来获取图像。

问题是我对 iOS 中的整个文件系统知之甚少,所以我不知道如何将特定的捆绑内容解压到 Documents Directory,也不知道如何写入 Documents Directory。

你能帮我一些代码并确认我的解决方案是正确的吗?

4

2 回答 2

3
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *destPath = [documentsDirectory stringByAppendingPathComponent:@"images"];  //optionally create a subdirectory

//"source" is a physical folder in your app bundle.  Once that has a blue color folder (not the yellow group folder)
// To create a physical folder in your app bundle: drag a folder from Mac's Finder to the Xcode project, when prompts
// for "Choose options for adding these files" make certain that "Create folder references for …" is selected.
// Store all your 300 or so images into this physical folder.

NSString *sourcePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"source"];  
NSError *error;
[[NSFileManager defaultManager] copyItemAtPath:sourcePath toPath:destPath error:&error];
if (error)
    NSLog(@"copying error: %@", error);

根据 OP 的附加评论进行编辑:

用相同的文件名重写到同一个目录,可以使用fileExistsAtPath和removeItemAtPath的组合在写入前检测并删除现有文件。

if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])
{
    [[NSFileManager defaultManager] removeItemAtPath:filePath error:&error];
}
// now proceed to write-rewrite
于 2013-02-27T18:56:04.647 回答
0

试试这个代码

-(void)demoImages
{

//-- Main bundle directory
NSString *mainBundle = [[NSBundle mainBundle] resourcePath];
NSFileManager *fm = [NSFileManager defaultManager];
NSError *error = [[NSError alloc] init];
NSArray *mainBundleDirectory = [fm  contentsOfDirectoryAtPath:mainBundle error:&error];

NSMutableArray *images = [[NSMutableArray alloc]init];
for (NSString *pngFiles in mainBundleDirectory)
{
    if ([pngFiles hasSuffix:@".png"])
    {
        [images addObject:pngFiles];
    }
}

NSLog(@"\n\n Doc images %@",images);
//-- Document directory
NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
 NSString *documentDirectory = [paths objectAtIndex:0];
NSFileManager *fileManager = [NSFileManager defaultManager];

//-- Copy files form main bundle to document directory
for (int i=0; i<[images count]; i++)
{
    NSString *toPath = [NSString stringWithFormat:@"%@/%@",documentDirectory,[images objectAtIndex:i]];
    [fileManager copyItemAtPath:[NSString stringWithFormat:@"%@/%@",mainBundle,[images objectAtIndex:i]] toPath:toPath error:NULL];
    NSLog(@"\n Saved %@",fileManager);
}


}
于 2014-01-21T13:18:38.997 回答