create_directory () против create_directories () - PullRequest
0 голосов
/ 08 мая 2018

В настоящее время я пытаюсь работать с std::filesystem. Я работаю на 64-битной Windows 7, используя MinGW-W64 GCC 7.1.0. Поскольку этот компилятор не поддерживает std::filesystem, я должен включить экспериментальную версию и ссылку с -lstdc++fs.

#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;

Это работало нормально до того момента, когда я хотел создать вложенные каталоги. Если я создаю каталоги по одному, используя create_directory(), все работает отлично. Теперь, если я использую create_directories() вместо этого, он выдает filesystem_error, если один из каталогов уже существует.

fs::path levelA{"."};
fs::path levelB{"folder"};
fs::path levelAB = levelA / levelB;  // "./folder"

bool create_separately; // set this bool as needed

if (create_separately) {
  /* This works perfectly */
  fs::create_directory(levelA);
  fs::create_directory(levelAB);
}
else {
  /* This throws because "." already exists */
  fs::create_directories(levelAB);
}

Сравнивая документацию экспериментальной версии со стандартной версией, было добавлено дополнительное предложение для стандартной версии:

Выполняет (1) для каждого элемента p, который еще не существует. Если p уже существует, функция ничего не делает (это условие не рассматривается как ошибка).

Почему это воспринималось как ошибка? Это считается ошибкой?

Дополнительно, есть ли простой способ обновить GCC в Windows? Я что-то читал о выпуске GCC 8.1.0 и какой-то новой версии MinGW, поддерживающей его, но я не могу найти какие-либо загрузки.

1 Ответ

0 голосов
/ 11 мая 2018

Возможно, вы имели в виду это, но учтите, что только второе предложение, которое вы цитировали, изменяется относительно версии TS.Это относится к случаю, когда p уже существует и может не являться каталогом ;функция возвращает false, чтобы указать, что она ничего не сделала, но не сообщает о ошибке , независимо от характера p.Большинство операционных систем не различают эту ситуацию, поэтому разработчик приложения должен спросить, заботятся ли они.

Это было добавлено в результате проблемы LWG ;смысл предыдущей формулировки был в лучшем случае неясен, без объяснения того, что произошло, если функция не удовлетворяла заявленному постусловию.Не существует общего понятия «сбой постусловия является ошибкой», но скорее «сбой постусловия при отсутствии сообщаемой ошибки логически невозможен».

Таким образом, причина неудачной реализации на . может показатьсябыть глючным.(У меня нет особых советов о том, как легче всего получить более новую версию.)

...