【问题标题】:Delete link to file without clearing readonly bit删除文件链接而不清除只读位
【发布时间】:2011-03-04 14:18:35
【问题描述】:

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

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

可以假设:

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

假设是不安全的:

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

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

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

【问题讨论】:

  • 如果您不想将此迁移到超级用户,请询问编程问题。这意味着指定可接受的语言和工具集,注意您查看的哪些 API 不适合您,您从尝试中得到哪些错误或异常,等等。我真的不知道如何回答这个问题。不过,我不会投票关闭 - 只是要求您编辑这些内容。
  • 用户模式下的任何工作方法都是可以接受的。 DeleteFile 不会删除只读文件。 GetFileAttributes/SetFileAttributes 可能不能很好地工作,因为它们采用文件名而不是句柄(祝你好运在刚刚删除的文件上更改只读)。
  • 什么样的链接?这个问题没有多大意义。
  • @Robaticus:听说过 CreateHardLink 吗?
  • @Joshua 不,抱歉,我没有。坦率地说,您对 TFS 的评论似乎有点牵强附会,在这里。由于 TFS 并不真正关心(太多)硬盘上某处文件的存在,因此它与这个问题有些无关。现在,如果你回顾你的经验,想想世界上有多少种不同类型的链接,从超链接到丢失链接,你可能会明白我为什么感到困惑。

标签: windows winapi readonly hardlink file-attributes


【解决方案1】:

感谢本·沃伊特:

#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);
        }
    }
}

【讨论】:

  • Ben,您可能看不到这是您在删除事务调用后的答案,但请放心。
【解决方案2】:

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

您可能会发现this newsgroup thread 很有帮助。

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

【讨论】:

  • 我很确定这只会让您了解文件安全性 (ACL);您仍然需要清除只读属性。
  • 我不想假设我有管理员权限;然而,这可能是一个解决方案。我试试看。
  • 我想您的另一个选择是读取只读属性,删除只读属性,删除链接并恢复只读属性,所有这些都在事务中。我会在我的答案中添加一些链接。
  • 仅供参考,我不在乎比赛条件。
  • 然后只需使用FindFirstFileNameWFindNextFileNameW 获取文件的幸存名称,您可以使用该名称将只读文件放回原处。
【解决方案3】:

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

【讨论】:

  • 您询问了如何在不清除只读位的情况下删除硬链接。在您回答时(暂时)在删除硬链接之前清除只读位。对于提出的问题,我的回答是正确的。也许您的意思是问“如何在不永久清除只读位的情况下删除硬链接”或类似的问题。
  • “没有潜在的竞争条件”中暗示了这一点
猜你喜欢
  • 2015-02-21
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
相关资源
最近更新 更多