删除链接到文件而不清除只读位

我有一组文件与他们的多个链接。

这些文件由TFS源代码控制所有,但是其他的链接都是由它们来完成的。 如何在不清除只读位的情况下删除附加链接。

假设:

  • 这些文件有多个链接
  • 您并未删除TFS所拥有的名称
  • 没有潜在的竞争条件
  • 您有ACL完全控制文件
  • 机器不会失去动力,除非这个过程花费太长时间,否则你的程序也不会被杀死。

假设:

  • 只读位被设置(如果不是,则不要设置)
  • 如果遇到错误并且初始设置,您可以将只读位清零

不要迁移到超级用户 – 如果迁移到那里,答案是不可能的,因为没有标准的工具可以做到这一点。

在一个假设的* nix系统中,需要写文件的写权限来删除它,有一个涉及fchmod()的解决scheme。 然而展现这种行为的系统是Windows系统。

您是否尝试启用SeBackupPrivilege和SeRestorePrivilege,允许管理员放松许多安全检查?

你可能会发现这个新闻组线程很有帮助。

编辑:要做到这一点没有特权,并没有创造一个竞争条件,你需要在Vista和以上的交易型NTFS支持。 顺便说一句,你可以使用句柄设置属性,将FILE_BASIC_INFO传递给SetFileInformationByHandle ,可以处理,请参阅注释。 或者您可以使用FindFirstFileName来查找另一个硬链接到同一个不被删除的文件,用它来设置只读。

  • CreateTransaction
  • GetFileAttributesTransacted
  • SetFileAttributesTransacted
  • CreateFileTransacted或FindFirstFileNameTransactedW
  • DeleteFileTransacted
  • 再次SetFileInformationByHandle或SetFileAttributesTransacted
  • CommitTransaction

感谢Ben Voigt:

 #include <windows.h> int main(int argc, char **argv) { while (*++argv) { HANDLE h; DWORD attrs; attrs = GetFileAttributes(*argv); SetFileAttributes(*argv, attrs & ~FILE_ATTRIBUTE_READONLY); h = CreateFile(*argv, GENERIC_READ|GENERIC_WRITE, 7, NULL, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL); SetFileAttributes(*argv, attrs); if (h != INVALID_HANDLE_VALUE) { CloseHandle(h); } } } 

这是不可能的。 硬链接是文件的另一个名称; 你可以有很多硬链接,但是只有一个底层文件对象(数据,安全描述符,属性,文件时间等)。 如果文件对象具有只读属性设置,则根据定义的任何硬链接也将具有设置的属性。