1

我正在将一些数据保存到.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);
}

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

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

4

2 回答 2

3

不,没有办法在纯 C 中设置文件权限,而不使用特定于操作系统的方法。我假设“标准库”是指 C 标准中描述的设施。

于 2019-06-10T21:25:03.667 回答
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没有对文件的写访问权限,例如,通过某个组的成员资格对文件也具有写访问权限,那么他们将只有对该文件的读访问权限。

于 2019-06-10T21:45:20.640 回答