我的应用程序生成大量图像,为了节省内存,我将这些文件写入临时目录并在需要时读取它们。我将同一图像的两个版本写入tmp文件夹,一个缩略图版本以较低分辨率写入,另一个版本为全尺寸。为了使文件名不可预测,我在最后添加了一个字符串哈希。
例如,我希望有两个图像,一个名为“ThumbnailImage.fgl8bda”,另一个名为“FullImage.fgl8bda”
这是我使用的代码:
NSString *fileName = @"Image.XXXXXXX";
NSString *thumbName = [@"Thumbnail" stringByAppendingFormat:@"%@", fileName];
NSString * thumbPath = [self writeToTempFile:thumbNailImage andName: thumbName];
NSString *fullName = [@"Full" stringByAppendingFormat:@"%@", fileName];
NSString *fullPath = [self writeToTempFile:fullImage andName: fullName];
但是,这两个文件的名称不同,即每次使用fileName变量时都会重新生成哈希值。例如,我的两个图像被称为“ThumbnailImage.jhu078l”和“FullImage.ksi9ert”。
知道我怎么能多次使用相同的哈希值?
答案 0 :(得分:2)
重复使用临时文件名后缀通常是不安全的,因为即使您可以确保A.ashkjd
不存在,也有可能B.ashkjd
被占用。
您可以构建一个文件夹并将两个图像存储在其中,例如
char tmpl[] = "Image.XXXXXX";
char* res = mkdtemp(tmpl);
if (res != NULL) {
NSString* dirName = [NSString stringWithUTF8String:res];
NSString* thumbPath = [dirName stringByAppendingPathComponent:@"Thumbnail.png"];
[thumbImage writeToFile:thumbPath atomically:YES];
NSString* fullPath = [dirName stringByAppendingPathComponent:@"Full.png"];
[fullImage writeToFile:fullPath atomically:YES];
}
(注意:您需要手动删除该文件夹。)
答案 1 :(得分:1)
@KennyTM有一个正确的解决方案,但他没有解释原因。
writeToTempFile 不使用哈希来填充名称的唯一部分。相反,它为每个调用使用一个新的唯一随机字符串。
答案 2 :(得分:0)
我是objc的新手,如果这是一个愚蠢的建议,请道歉。如果您使用的是stringByAppendingString
而不是description
,则会发生什么情况:
NSString *thumbName = [@"Thumbnail" stringByAppendingString:fileName];
我不明白为什么这两者在这个用途上并不相同,但仍然如此。
另外,你如何/在哪里生成哈希?
修改
@ ar06我认为你说你的(我假设它是你的)writeToTempFile
方法会将fileName
参数中的XXXXX替换为随机值。如果是这样那么那就是你的问题 - 它每次被调用时都会生成一个新的随机数,而你正在调用它两次。您发布的代码片段确实有效,因为fileName是不可变的;它将以“XXXXX”扩展名保存。
您是否需要稍后参考这些随机后缀? writeToTempFile
也可以使用您用于跟踪它们的任何机制将相同的值附加到拇指和全尺寸。
FWIW我同意Kenny的方法更好,因为你不能保证唯一性。
答案 3 :(得分:0)
@TimG
它并没有真正有所作为。这也以不同的名字结束。
写作时
NSString *fileName = @"Image.XXXXXXX";
fileName的XXXXXXX
部分被7个随机字符替换,因此文件名不可预测。
干杯