【问题标题】:Create file with read-only mode in C在 C 中创建具有只读模式的文件
【发布时间】:2019-10-25 06:53:00
【问题描述】:

我正在将一些数据保存到.txt 文件中,如下所示:

void save_file()
{
    char *file_name = "my_file.txt";

    FILE *f = fopen(file_name, "w");
    if (f == NULL)
        return;

    // some fprintf instructions

    fclose(f);
}

一切都很完美。但是,我希望此文件启用只读属性。 (Windows 10)

仅使用标准库可以解决我的问题吗?

【问题讨论】:

  • “一切正常”?真的吗? if ( f = NULL ) ?
  • 已修复,现在一切正常。

标签: c winapi file-security


【解决方案1】:

没有。如果不求助于特定于操作系统的方法,就无法在纯 C 中设置文件权限。我假设“标准库”是指 C 标准中描述的设施。

【讨论】:

    【解决方案2】:

    C 没有开箱即用的文件安全概念。由于您使用的是 Windows,因此您可以使用 Windows 的安全 API 将特定用户或组的 ACL 设置为“R”(只读)。以下是针对特定用户的操作方法:

    #include <Windows.h>
    #include <aclapi.h>
    
    DWORD WINAPI MakeUserAccessReadOnly(
        LPWSTR lpPath,
        SE_OBJECT_TYPE objType,
        LPWSTR lpUser
    )
    {
        PSECURITY_DESCRIPTOR pSD;
        PACL pCurrentACL, pNewACL;
        EXPLICIT_ACCESSW ea;
        DWORD dwError;
    
        dwError = GetNamedSecurityInfoW(lpPath, objType, DACL_SECURITY_INFORMATION, NULL, NULL, &pCurrentACL, NULL, &pSD);
        if (dwError != ERROR_SUCCESS)
        {
            return dwError;
        }
    
        ZeroMemory(&ea, sizeof(EXPLICIT_ACCESSW));
        ea.grfAccessPermissions = GENERIC_READ;
        ea.grfAccessMode = SET_ACCESS;
        ea.grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT;
        ea.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
        ea.Trustee.TrusteeType = TRUSTEE_IS_USER;
        ea.Trustee.ptstrName = lpUser;
    
        dwError = SetEntriesInAclW(1, &ea, pCurrentACL, &pNewACL);
        if (dwError != ERROR_SUCCESS)
        {
            return dwError;
        }
    
        dwError = SetNamedSecurityInfoW(lpPath, objType, DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION, NULL, NULL, pNewACL, NULL);
        LocalFree((HLOCAL)pNewACL);
    
        return dwError;
    }
    

    然后你可以像这样调用函数:

    MakeUserAccessReadOnly(L"C:\\Path\\FileToMakeReadOnly.ABC", SE_FILE_OBJECT, L"PC-NAME\\UserName");
    

    然后,假设名为UserName 的用户没有对文件的写访问权限,例如,通过对文件具有写访问权限的组的成员身份,他们将只有对该文件的读访问权限。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-22
      • 1970-01-01
      • 1970-01-01
      • 2017-12-21
      • 2013-01-13
      相关资源
      最近更新 更多