あなたが求めているのは、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
)。