Я использую следующий код для отображения в памяти файла для чтения в 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 ++ в режиме администратора?