Заблокировать файл, чтобы избежать чтения из любой внешней программы c ++ [duplicate]

Python имеет много вариантов от основных трех режимов, эти три режима:

'w'   write text
'r'   read text
'a'   append text

Итак, чтобы добавить в файл, это так же просто, как:

f = open('filename.txt', 'a') 
f.write('whatever you want to write here (in append mode) here.')

Тогда есть режимы, которые просто делают ваш код меньше строк:

'r+'  read + write text
'w+'  read + write text
'a+'  append + read text

Наконец, существуют режимы чтения / записи в двоичном формате:

'rb'  read binary
'wb'  write binary
'ab'  append binary
'rb+' read + write binary
'wb+' read + write binary
'ab+' append + read binary
10
задан sofr 8 May 2009 в 14:45
поделиться

4 ответа

Вы не можете сделать это со стандартным fstream, вам придется использовать определенные для платформы функции.

В Windows вы можете использовать CreateFile () или LockFileEx () . В Linux существует flock () , lockf () и fcntl () (как сказал предыдущий комментатор).

Если вы используете MSVC, вы можете передать третий параметр в конструктор fstream. См. Документацию для версий Visual Studio 6 или более поздних версий . Конечно, он не будет работать с другими компиляторами и платформами.

Почему вы все равно хотите заблокировать других? Возможно, будет лучшее решение ...

13
ответ дан Ben Voigt 21 August 2018 в 12:14
поделиться

Расширение комментария к Casebash:

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

file.rdbuf()->open(path, std::ios_base::app, _SH_DENYWR);

_SH_DENYRW будут лишены доступа для чтения и записи

5
ответ дан David Sykes 21 August 2018 в 12:14
поделиться

Используя модуль Boos Interprocess , существует функция блокировки файла .

Заблокируйте файл, откройте его, прочитайте и / или напишите из / к нему, закройте его, откройте его.

2
ответ дан Some programmer dude 21 August 2018 в 12:14
поделиться

Невозможно сделать это на родном C ++, так как это будет сильно зависит от платформы. В Linux / UNIX вы можете сделать это с помощью flock или fcntl . Я не уверен, как это сделать в Windows.

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

Обратите внимание, что все эти методы работают с дескрипторами / дескрипторами базового OS-файла, а не с fstream s. Вам потребуется либо использовать Posix, либо Windows API для чтения / записи из файла или обернуть дескриптор / дескриптор файла в fstream. Это снова зависит от платформы. Я уверен, что есть способ сделать это, но я не помню этого с головы.

3
ответ дан Zifre 21 August 2018 в 12:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: