1

ファイルの存在を確認し、存在する場合は削除するコードがあります。問題は、ファイルが書き込み可能であってはならない場合でも、失敗することができないことです。私のコードは次のようになります:

if([theManager fileExistsAtPath:savingAs isDirectory:&destIsDir])
   {
   BOOL itemRemoved=[theManager removeItemAtPath:savingAs error:&err];
   if(!itemRemoved)
      {
      // why?
      NSAlert *rebuildAlert=[NSAlert alertWithMessageText:@"Error removing item" 
        defaultButton:nil alternateButton:nil otherButton:nil
        informativeTextWithFormat:@"%@",[err localizedDescription]];
      [rebuildAlert runModal];
      proceed=NO;
      }
   }

所有権を root:wheel に設定し、モードを 000 (つまり、誰でも読み取り、書き込み、実行できない) に設定しても、ファイルは黙って削除されます。私がこれを実行しているアカウントは管理者権限を持つユーザー アカウントですが、それでも root が所有するファイルを削除できるのはあまり安全ではないようです。エラーをスローする唯一の方法は、chflags uchg filenameを使用してファイルをロックすることです。fileManager:shouldRemoveItemAtPath:また、必要に応じてアクセス許可を確認できるデリゲート メソッドを (今のところスタブとして) 実装しました。問題は、このメソッドから戻ってもエラーが返されNOないことです。removeItemAtPath:で再確認するのfileExistsAtPath:は面倒そうです。NSFileManager最後に、どのインスタンスがへの呼び出しを発行しているかを明確にする簡単な方法はないようです。removeItemAtPath:デリゲート メソッドで。通常、これらのインスタンスは一時的なオブジェクトであるため、ID は長期間有効ではありません。NSFileManager をサブクラス化し、タグ インスタンス変数を追加することもできますが、それは非常に難しい作業のように思えます。

要約すれば:

1) removeItemAtPath が所有していないファイルを無視するのは正しい動作ですか?

2) デリゲート メソッドでのファイルの削除を禁止しても、呼び出し元には通知されません。removeItemAtPath

3) どの呼び出しがデリゲート メソッドを呼び出しているかを判断するのは難しい

4

1 に答える 1

4

これは正しい動作です。ファイルの消去には、ファイルを含むディレクトリのみが必要で、ファイルへの読み取りアクセスは必要ありません。ディレクトリをファイルのリストと考えてください。ファイルの消去は、単にそのリストから削除するだけで、すべて意味があります。

于 2012-08-06T00:18:12.283 に答える