Использование std: fstream, как запретить доступ (чтение и запись) к файлу - PullRequest
12 голосов
/ 08 мая 2009

Как я могу запретить доступ к файлу, который я открываю с помощью fstream? Я не могу получить доступ к файлу во время чтения / записи в него с помощью fstream?

Ответы [ 3 ]

14 голосов
/ 08 мая 2009

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

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

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

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

5 голосов
/ 27 ноября 2012

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

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

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

_SH_DENYRW будет запрещать как чтение, так и запись

3 голосов
/ 08 мая 2009

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

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

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

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