При работе с файлами файловой системы в Windows и, в частности, с CreateFile API:
Что касается совместного доступа, то есть наличия нескольких независимых CreateFile
вызовов для открытия одного и того же файла, возможно, с разными флагами и режимами совместного использования, имеет ли какое-либо значение, выполняется ли доступ к файлу из одного и того же процесса или из другого процесса? ?
То есть, если кто-то открыл файл с доступом CreateFile(..., FILE_SHARE_READ, ...)
, никто не сможет открыть тот же файл с доступом GENERIC_WRITE
. Имеет ли значение, исходят ли разные вызовы из одного и того же процесса или из разных процессов?
На данный момент у меня сложилось впечатление, что границы процесса не имеют значения для независимых CreateFile
вызовов одного и того же файла. (Они имеют значение для обработки наследования и т.д.)
Но эти документы содержат такие жемчужины, как:
Чтобы разрешить процессу совместно использовать файл или устройство, в то время как другой процесс имеет открытый файл или устройство, используйте совместимую комбинацию одного или больше следующих значений. Для получения дополнительной информации о действительных комбинации этого параметра с параметром dwDesiredAccess, см. Создание и открытие файлов.
что не внушает доверия.
Нет. В общем, такие ограничения доступа к файлам не имеют значения, сделаны ли они из того же или другого процесса.
Флаги общего доступа к файлам всегда работают одинаково.
Как ответил @xMRi, не имеет значения, находится ли второй действительный вызов CreateFile в том же процессе или нет. Создание и открытие файлов
иллюстрирует допустимые комбинации двух вызовов CreateFile с использованием различные режимы доступа и совместного использования (dwDesiredAccess, dwShareMode соответственно). Неважно, в каком порядке вызывается CreateFile. сделаны.
Пример для иллюстрации.
#include <Windows.h>
#include <Tchar.h>
int main()
{
//...
HANDLE hFile1 = CreateFile(TEXT("tempfile"),
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
0,
NULL);
HANDLE hFile2 = CreateFile(TEXT("tempfile"),
GENERIC_READ,
FILE_SHARE_READ| FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
0,
NULL);
if (hFile1 != INVALID_HANDLE_VALUE && hFile2 != INVALID_HANDLE_VALUE)
{
HANDLE hFile = hFile1;
//HANDLE hFile = hFile2;
FILE_BASIC_INFO fdi{};
fdi.FileAttributes = FILE_ATTRIBUTE_TEMPORARY | FILE_ATTRIBUTE_NORMAL;
BOOL fResult = SetFileInformationByHandle(hFile,
FileBasicInfo,
&fdi,
sizeof(FILE_BASIC_INFO));
if (fResult)
{
// File will be deleted upon CloseHandle.
_tprintf(TEXT("SetFileInformationByHandle marked tempfile for deletion\n"));
// ...
// Now use the file for whatever temp data storage you need,
// it will automatically be deleted upon CloseHandle or
// application termination.
// ...
}
else
{
_tprintf(TEXT("error %lu: SetFileInformationByHandle could not mark tempfile for deletion\n"),
GetLastError());
}
CloseHandle(hFile);
// At this point, the file is closed and deleted by the system.
}
else
{
_tprintf(TEXT("error %lu: could not create tempfile\n"),
GetLastError());
}
//...
}