如何在iOS上每次打开独特文件夹中的解压缩文件

时间:2012-09-28 01:01:51

标签: iphone objective-c ios xcode cocoa-touch

在我的iOS应用程序中,我正在解压缩“app / temp”文件夹中的文件,如下所示:

NSString *unzipFolder = [[CommonFunctions getCachePath] stringByAppendingPathComponent:@"/temp/"];

一旦我完成它,我删除项目:

    [[NSFileManager defaultManager] removeItemAtPath:unzipFolder error:&e];

问题是bcz即时创建解压文件的多个副本一些文件图像名称相同并显示错误的图像,我没有找到错误,为什么我的删除功能不起作用!

对于用户打开的每条消息,我有什么方法可以在不同路径上解压缩文件夹? 谢谢:)

1 个答案:

答案 0 :(得分:1)

听起来,您要问的是如何为每次unzipFolder生成一个唯一的名称。

请勿使用硬编码名称。几乎任何事都可以。例如:

NSString *unzipFolderTemplate = [[CommonFunctions getCachePath] stringByAppendingPathComponent:@"temp.XXXXXX"];
char *template = strdup([template fileSystemRepresentation]);
if (mkdtemp(template)) {
  NSString *unzipFolder = [NSString stringWithFileSystemRepresentation:template
                                                                length:strlen(template)];
  free(template);
  // do the work
  [[NSFileManager defaultManager] removeItemAtPath:unzipFolder error:&e];
}

关于mkdtemp的好处是它为你创建了目录,并保证没有竞争条件,某种方式 - 遗留目录或其他问题。它也更安全,例如,有人写一个破解或其他越狱黑客,通过预测路径来利用你的代码。当然,缺点是你必须下拉到C字符串(这意味着一个明确的free)。但是,正如我所说,有很多可能性,几乎任何事情都可以。

另请注意,我使用的是@"temp.XXXXXX",而不是@"/temp.XXXXXX/"。那是因为-[stringByAppendingPathComponent:]已经为你添加了任何必要的斜杠(实际上是方法的重点),并且目录创建函数不需要尾部斜杠,因此两个斜杠都是不必要的。

与此同时,我仍然对你想要做的事感到困惑。如果您需要为每条消息保留一个唯一的文件夹,并在完成该消息后删除该文件夹,并且您可以同时打开多条消息,则需要一些方法来记住哪个文件夹与哪条消息有关。 / p>

为此,在某处创建NSMutableDictionary,在free(template)之后,您需要执行[tempFolderMap addObject:unzipFolder forKey:messageName]之类的操作。然后,在关闭邮件时,您将执行[tempFolderMap objectForKey:messageName]并将结果用于removeItemAtPath:error:邮件(然后您也可以从tempFolderMap删除密钥。)