4

我有一组包含多个链接的文件。

这些文件归 TFS 源代码控制所有,但对它们进行了其他链接。如何在不清除只读位的情况下删除其他链接。

可以安全地假设:

  • 这些文件有多个链接
  • 您没有删除 TFS 拥有的名称
  • 没有潜在的竞争条件
  • 您对文件拥有 ACL 完全控制权
  • 机器不会断电,你的程序也不会被杀死,除非它花费的时间太长。

假设是不安全的:

  • 设置了只读位(如果不是,请不要设置它)
  • 如果遇到错误并且最初设置了只读位,则可以将其保留为清除

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

在一个假设的 *nix 系统上,需要对文件有写权限才能删除它,有一个涉及 fchmod() 的解决方案。然而,出现这种行为的系统是 Windows 系统。

4

3 回答 3

4

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

您可能会发现此新闻组主题很有帮助。

编辑:要在没有特权且不创建竞争条件的情况下执行此操作,您需要在 Vista 及更高版本中提供事务性 NTFS 支持。顺便说一句,您可以使用句柄设置属性,将 FILE_BASIC_INFO 传递给SetFileInformationByHandle,可以进行交易,请参阅注释。或者,您可以使用 FindFirstFileName 找到另一个指向未删除的同一文件的硬链接,并将其设置为只读。

于 2010-06-18T04:11:33.137 回答
4

感谢本·沃伊特:

#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);
        }
    }
}
于 2010-06-28T23:27:28.607 回答
2

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

于 2010-06-18T03:14:21.687 回答