В C ++, как безопасно создать файл, если он не существует, но не открыть его, если он существует? - PullRequest
0 голосов
/ 07 апреля 2020

Если я непосредственно использую ios::out для открытия файла, то он перезапишет его или изменит его, если файл существовал.

Но если я проверю, существует ли файл с именем "XXX" с помощью ios::in, и создайте его с помощью ios::out, если он не существует, файл "XXX" может быть создан другой программой в течение этого периода, тогда файл "XXX" будет перезаписан или изменен так же, как и в первом случае.

Как безопасно создать файл с fstream в C ++?

Ответы [ 3 ]

4 голосов
/ 07 апреля 2020

Правильное решение вашей проблемы в стандартной библиотеке C ++ доступно только начиная с C ++ 17 - не в C ++ 11 (а в стандартной библиотеке C начиная с C11):

std::fopen (и C s fopen) теперь позволяет использовать подспецификатор x, который вызывает сбой функции, если файл уже существует ( https://en.cppreference.com/w/cpp/io/c/fopen)

Флаг режима доступа к файлу "x" может быть добавлен к спецификаторам "w" или "w +". Этот флаг вызывает сбой функции, если файл существует, вместо перезаписи. (C ++ 17)

0 голосов
/ 07 апреля 2020

Если вы используете Microsoft C ++, вы можете сделать следующее:

    std::fstream file;
    bool ok = file.open("path_to_my_file", std::ios::app, _SH_DENYWR); // open the file in non sharing write mode
    if (ok)
    {
     // you now have exclusive access to the file
    }
    else 
    {
      // try later (for instance)
    }

Это не стандарт C ++, но это гарантирует, что тот, кто откроет файл первым, получит его и не удалит существующее содержимое (ios :: приложение)

0 голосов
/ 07 апреля 2020

Чтобы избежать перезаписи, используйте ios :: app при записи в существующий файл, чтобы добавить к нему новые данные вместо перезаписи.

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