NSFileManager removeItemAtPath:错误:不尊重POSIX权限

时间:2012-08-06 00:04:36

标签: macos cocoa nsfilemanager

我有一些代码可以检查文件是否存在,如果存在,则将其删除。问题是,即使文件不可写,我也无法让它失败。我的代码如下:

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和mode为000(即不可读,可写或任何人都可执行),文件仍然会被静默删除。我运行此帐户的帐户是具有管理员权限的用户帐户,但即便如此,能够杀死root拥有的文件似乎不太安全。抛出错误的唯一方法是使用chflags uchg filename 锁定文件。我还实现了(作为现在的存根)fileManager:shouldRemoveItemAtPath:委托方法,我可以在必要时检查权限。问题是从此方法返回NO不会导致removeItemAtPath:返回错误。使用fileExistsAtPath:重新检查似乎很麻烦。最后,似乎没有一种简单的方法可以消除NSFileManager的哪个实例在委托方法中发出对removeItemAtPath:的调用的歧义。通常,这些实例是暂时性对象,因此它们的id在任何相当长的时间内都无效。我可以对NSFileManager进行子类化并添加一个标签实例变量,但这似乎是一个破解坚果的大锤。

总结:

1)removeItemAtPath忽略它不拥有的文件是否正确?

2)在委托方法中禁止删除文件不会传回给removeItemAtPath

的来电者

3)确定调用委托方法的调用很难

1 个答案:

答案 0 :(得分:4)

这是正确的行为。擦除文件不需要对文件的读访问权限,只需要包含该文件的目录。将目录视为文件列表,并将文件删除为简单地从该列表中删除它,这一切都有意义。

相关问题