iOS - 将多张图片保存到文档文件夹

3
我有这段代码来将图像保存到文档文件夹中。
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,        NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *savedImagePath = [documentsDirectory  stringByAppendingPathComponent:@"savedImage.png"];
    UIImage *image = imageView.image; // imageView is my image from camera
    NSData *imageData = UIImagePNGRepresentation(image);
    [imageData writeToFile:savedImagePath atomically:NO]; 

我正在寻找一种方法,能够保存多张图片,因为这样可以避免覆盖已保存的图片(savedImage.png)。

我不介意在Google或其他地方搜索,但我需要知道它被称为什么,因为使用错误的关键字会浪费时间。

谢谢!


你想要每张图片保存到不同的文件吗? - rdelmar
4个回答

7

您需要更改附加到图像documentsDirectory路径的文件名称,位于第三行。每次使用不同的尚未使用过的名称。NSFileManager有方法可以查看文件是否存在,因此可以构造文件名,然后测试它是否存在于该位置,如果存在,则增加重复计数并尝试下一个。

如果 num 是您在某处定义并保留的整数,以便您知道上次使用的最后一个整数(并且已在某个地方初始化为1)。

// your code to get the directory here, as above

NSFileManager *fm = [NSFileManager ...]

do {
   savedImagePath = [documentsDirectory stringByAppendingPathComponent: 
        [NSString stringWithFormat: @"%@-%d.png", @"savedImage", num]];
   num += 1; // for next time

  if ( ![fm fileExistsAtPath: savedImagePath] )
  {
      // save your image here using savedImagePath
      exit;
  }
} while ( //some kind of test for maximum tries/time or whatever )

你需要查找语法以获取NSFileManager实例和确切的文件存在方法签名,但这就是要点。


想一想:在文件系统中,如果您将第二个文件放在相同的位置并使用相同的名称,它将替换现有文件,对吧?如果您想将其保存在相同的位置,则必须给它另一个名称。在Finder中,当您复制文件时,Finder会自动将数字或“副本”附加到文件名后面。上面的代码只是试图向您展示这一点,并建议您在末尾添加一个数字。阅读您不理解的部分的文档,例如stringWithFormat:NSFileManager等。 - Dad
你必须学会阅读文档,以了解现有类的功能和工作原理。Rishi在上面提到的追加日期的答案也是一种选择,如果包括毫秒,则可能更容易,因为您不必测试它是否已经存在。 - Dad
如果我们没有理解您的问题,那么可以尝试澄清一下。 - Dad
你已经理解了问题,我已经实现了你的解决方案。在 while 部分,我现在只是输入了 (nil),直到我解决这个问题。 - jwknz
在将1000多张图像存储在NSDocumentDirectory中时,有导致应用程序崩溃的可能性吗? - Muruganandham K
显示剩余2条评论

5
如果您使用当前日期和时间保存文件,则无需担心相同名称覆盖问题。
-(NSString*)getCurrentDateTimeAsNSString
{
    NSDateFormatter *format = [[NSDateFormatter alloc] init]; 
    [format setDateFormat:@"yyyyMMddHHmmss"];
    NSDate *now = [NSDate date];
    NSString *retStr = [format stringFromDate:now];
    [format release];

    return retStr;
}

1

您可以每次创建一个新文件来完成此操作。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"YOURiMAGEfILE.IMAGEeXTENSION"];
NSFileManager *fileManager = [NSFileManager defaultManager];

    if (![fileManager fileExistsAtPath: path]) 
    {
        path = [documentsDirectory stringByAppendingPathComponent: [NSString stringWithFormat: @"YOURiMAGEfILE.IMAGEeXTENSION] ];
    }

然后您可以在创建的文件上执行上述操作。


抱歉,我无法让这个解决方案按照我需要的方式工作。也许是我误解了它 :-) - jwknz

1
希望它能帮助您为我工作!
if let image = info[UIImagePickerControllerOriginalImage] as? UIImage
    {
        let i = Int(arc4random())

        let str = String(i).appending(".png")

        let fileManager = FileManager.default
        let paths = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString).appendingPathComponent(str)

        print(paths)

        let imageData = UIImagePNGRepresentation(image)
        fileManager.createFile(atPath: paths as String, contents: imageData, attributes: nil)
    }
    else{
        print("error")

    }

虽然答案总是受欢迎的,但请包括一个简要说明上述解决方案是如何解决问题的。 - Leigh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接