Я сохраняю некоторые данные в файл .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)
Есть ли решение моей проблемы с использованием только стандартных библиотек?
Исправил, теперь все работает отлично.





Нет. В чистом C нет способа установить права доступа к файлам, не прибегая к методам, специфичным для ОС. Я предполагаю, что под «стандартные библиотеки» вы имеете в виду средства, описанные в стандарте C.
C не имеет готовой концепции безопасности файлов. Поскольку вы используете Windows, вы можете использовать API-интерфейсы безопасности Windows, чтобы установить 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 не имеет доступа на запись к файлу, скажем, из-за членства в группе, которая также имеет доступ на запись к файлу, он будет иметь доступ только для чтения к файлу.
"Все работает идеально"? Действительно?
if ( f = NULL )?