代码之家  ›  专栏  ›  技术社区  ›  Joshua

删除指向文件的链接而不清除只读位

  •  4
  • Joshua  · 技术社区  · 14 年前

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

    这些文件归TFS源代码管理所有,但其他指向它们的链接都指向它们。如何删除附加链接而不清除只读位?

    可以假设:

    • 这些文件有多个链接指向它们
    • 您没有删除tfs拥有的名称
    • 没有潜在的比赛条件
    • 您拥有文件的ACL完全控制权
    • 这台机器不会断电,你的程序也不会被终止,除非时间太长。

    假设:

    • 只读位已设置(如果不设置,则不设置)
    • 如果遇到错误并且最初设置了只读位,则可以清除它。

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

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

    3 回复  |  直到 14 年前
        1
  •  4
  •   Ben Voigt    14 年前

    您是否尝试过启用Sebackupprivilege和SerestorePrivilege,它允许管理员放松许多安全检查?

    你可能会发现 this newsgroup thread 乐于助人。

    编辑: 要在没有特权和不创建竞争条件的情况下进行此操作,您需要Vista和更高版本中提供事务性的NTFS支持。顺便说一句,您可以使用句柄设置属性,将文件基本信息传递给 SetFileInformationByHandle 可进行交易,见附注。或者,您可以使用findfirstfilename找到另一个指向同一个文件的硬链接,该文件不会被删除,使用该硬链接可以设置为只读。

        2
  •  4
  •   Joshua    14 年前

    感谢本·沃伊特:

    #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);
            }
        }
    }
    
        3
  •  2
  •   Luke    14 年前

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