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 回答