2010-08-04 48 views
0

我的應用程序生成大量圖像,爲了節省內存,我將這些文件寫入臨時目錄並在需要時讀取它們。我將同一圖像的兩個版本寫入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

你如何實現'-writeToTempFile:...'? – kennytm 2010-08-04 14:03:08

回答

2

重新使用臨時文件名後綴通常是不安全的,因爲即使可以確保A.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]; 
} 

(注意:您需要手動刪除的文件夾)

+0

非常感謝。會這樣做。這非常有幫助。 – ar106 2010-08-04 14:22:50

0

我是新來objc所以道歉,如果這是一個愚蠢的建議。如果你使用stringByAppendingString而不是description,你調用會發生什麼:

NSString *thumbName = [@"Thumbnail" stringByAppendingString:fileName];

我不明白爲什麼這兩者並不等同於這種用法,但仍。

此外,你如何/你在哪裏生成散列?

編輯

@ AR06我想你是說,你的(我假設這是你的)writeToTempFile方法做了上XXXXX」在fileName參數替換爲隨機值。如果是這樣,那就是你的問題 - 每次調用它時會產生一個新的隨機數,並且你調用它兩次。您發佈的代碼片段確實有效,因爲fileName是不可變的;它將以'XXXXX'擴展名保存。

以後需要引用這些隨機後綴嗎?無論您使用哪種機制來跟蹤它們,writeToTempFile還可以使用將相同的值附加到拇指和全尺寸。

FWIW我同意肯尼的方法更好,因爲你不能保證唯一性。

0

@TimG

這並沒有真正的區別。這也以不同的名字結束。

當我寫

NSString *fileName = @"Image.XXXXXXX"; 

文件名的XXXXXXX部分由7個隨機字符,以使文件名是不可預測的更換。

乾杯

1

@KennyTM有一個正確的解決方案,但他沒有解釋原因。

writeToTempFile確實不是使用散列填充名稱的唯一部分。相反,它爲每個調用使用一個新的唯一隨機字符串。

相關問題