Имеет ли значение для CreateFile, были ли открыты другие дескрипторы того же файла тем же или другим процессом?

При работе с файлами файловой системы в Windows и, в частности, с CreateFile API:

Что касается совместного доступа, то есть наличия нескольких независимых CreateFile вызовов для открытия одного и того же файла, возможно, с разными флагами и режимами совместного использования, имеет ли какое-либо значение, выполняется ли доступ к файлу из одного и того же процесса или из другого процесса? ?

То есть, если кто-то открыл файл с доступом CreateFile(..., FILE_SHARE_READ, ...), никто не сможет открыть тот же файл с доступом GENERIC_WRITE. Имеет ли значение, исходят ли разные вызовы из одного и того же процесса или из разных процессов?

На данный момент у меня сложилось впечатление, что границы процесса не имеют значения для независимых CreateFile вызовов одного и того же файла. (Они имеют значение для обработки наследования и т.д.)

Но эти документы содержат такие жемчужины, как:

Чтобы разрешить процессу совместно использовать файл или устройство, в то время как другой процесс имеет открытый файл или устройство, используйте совместимую комбинацию одного или больше следующих значений. Для получения дополнительной информации о действительных комбинации этого параметра с параметром dwDesiredAccess, см. Создание и открытие файлов.

что не внушает доверия.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Нет. В общем, такие ограничения доступа к файлам не имеют значения, сделаны ли они из того же или другого процесса.

Флаги общего доступа к файлам всегда работают одинаково.

Как ответил @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());
    }
    //...
}

Другие вопросы по теме