1

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

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

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

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

问题是 bcz 我正在创建解压缩文件的多个副本,其中一些文件的图像名称相同并显示错误的图像,而且我没有发现为什么我的删除功能不起作用的错误!

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

4

1 回答 1

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:]已经为您添加了任何必要的斜杠(实际上就是该方法的全部要点),并且目录创建函数不需要尾部斜杠,因此两个斜杠都是不必要的。

同时,我仍然对您尝试做的事情感到有些困惑。如果您需要为每条消息保留一个唯一的文件夹,并在完成该消息后删除该文件夹,并且您可以一次打开多条消息,则需要某种方式来记住哪个文件夹与哪个消息一起使用。

为此,创建一个NSMutableDictionary地方,然后free(template)你会想做类似的事情[tempFolderMap addObject:unzipFolder forKey:messageName]。然后,在关闭消息时,您将执行[tempFolderMap objectForKey:messageName]并使用removeItemAtPath:error:消息的结果(然后您也可以从 中删除密钥tempFolderMap)。

于 2012-09-28T01:22:24.253 回答