Могу ли я отобразить файл в память и разрешить другим процессам запись в него? - PullRequest
0 голосов
/ 09 февраля 2020

Я использую следующий код для отображения в памяти файла для чтения в windows (Windows 10):

HANDLE windowsFileHdl = CreateFileA(filePath, GENERIC_READ, FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (windowsFileHdl == INVALID_HANDLE_VALUE)
{
  return false;
}

HANDLE fileMappedHdl = CreateFileMappingA(windowsFileHdl, 0, PAGE_READONLY, 0, 0, nullptr);
char* baseFileData = (char*)MapViewOfFile(fileMapedHdl, FILE_MAP_READ, 0, 0, 0);

Я бы хотел, чтобы другие записывали этот файл, пока я читая это. Это возможно?

В настоящее время я получаю сообщение об ошибке:

Процесс не может получить доступ к файлу, поскольку он используется другим процессом.

Выше ошибка была получена при попытке открыть файл в отдельной программе (Блокнот), пока он отображался в памяти.

Это ограничение в том, как ОС отображает файл в память, или я пропустил какой-либо флаг?

РЕДАКТИРОВАТЬ: @ zett42 указал, что мне не хватает FILE_SHARE_READ, добавив это делает код:

HANDLE windowsFileHdl = CreateFileA(filePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (windowsFileHdl == INVALID_HANDLE_VALUE)
{
  return false;
}

HANDLE fileMappedHdl = CreateFileMappingA(windowsFileHdl, 0, PAGE_READONLY, 0, 0, nullptr);
char* baseFileData = (char*)MapViewOfFile(fileMapedHdl, FILE_MAP_READ, 0, 0, 0);

Теперь блокнот может открывать и записывать в файл!

Однако в других программах, таких как Visual Studio, Notepad ++ или Emacs, по-прежнему возникают ошибки при записи в файл.

Ошибка Visual Studio:

Процесс не может получить доступ к файл, потому что он используется другим процессом.

Ошибка Notepad ++:

Файл не может быть сохранен и может быть защищен. Вы хотите запустить Notepad ++ в режиме администратора?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...