1

私の iOS アプリケーションでは、次のように「app/temp」フォルダー内のファイルを解凍しています。

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

そして、それが終わったら、次のようにアイテムを削除します:

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

問題は、bcz imが解凍ファイルの複数のコピーを作成していることです。一部のファイルの画像名は同じで、間違った画像を表示しています。削除機能が機能しない理由についてエラーが見つかりません!

ユーザーが開いたメッセージごとに異なるパス上のフォルダーを解凍する方法はありますか? ありがとう :)

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 に答える