在C中以只读模式创建文件
Create file with read-only mode in C
我正在将一些数据保存到 .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)
是否可以仅使用标准库来解决我的问题?
没有。如果不求助于 OS-specific 方法,则无法在纯 C 中设置文件权限。我假设,“标准库”是指 C 标准中描述的设施。
C 没有开箱即用的文件安全概念。由于您使用的是 Windows,因此您可以使用 Windows' 安全 API 将特定用户或组的 ACL 设置为 "R" (read-only)。以下是针对特定用户的操作方法:
#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
的用户没有对该文件的写访问权限,例如,作为对文件也具有写访问权限的组的成员,他们将只有对文件的读访问权限文件。
我正在将一些数据保存到 .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)
是否可以仅使用标准库来解决我的问题?
没有。如果不求助于 OS-specific 方法,则无法在纯 C 中设置文件权限。我假设,“标准库”是指 C 标准中描述的设施。
C 没有开箱即用的文件安全概念。由于您使用的是 Windows,因此您可以使用 Windows' 安全 API 将特定用户或组的 ACL 设置为 "R" (read-only)。以下是针对特定用户的操作方法:
#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
的用户没有对该文件的写访问权限,例如,作为对文件也具有写访问权限的组的成员,他们将只有对文件的读访问权限文件。