boost::filesystem::create_directories(".")
всегда терпит неудачу в моей системе. Кажется, что это может быть ошибкой, но после прочтения документации я не совсем уверен. Вот пример программы:
#include <iostream>
#include <boost/filesystem.hpp>
int main(int argc, char* argv[])
try
{
namespace fs = boost::filesystem;
std::cerr << "is_directory: " << fs::is_directory(argv[1]) << '\n';
std::cerr << "create_directory: " << fs::create_directory(argv[1]) << '\n';
std::cerr << "create_directories: " << fs::create_directories(argv[1]) << '\n';
}
catch (const std::exception& ex)
{
std::cerr << ex.what() << '\n';
}
Если я запускаю это с аргументом .
(имеется в виду текущий каталог), он печатает:
is_directory: 1
create_directory: 0
boost::filesystem::create_directories: Invalid argument
Первые две строки не удивляют: .
это каталог, и create_directory()
задокументировано высказывание:
Ошибка создания, поскольку p разрешает существующий каталог, не должна рассматриваться как ошибка.
Но третья строка меня удивляет: create_directories(".")
не удалось, хотя .
существует. Нет такой ошибки, если вы используете другое имя, например foo
— он с радостью создаст этот каталог или просто вернет false, если он уже существует.
Документы имеют это, чтобы сказать:
Эффект: устанавливает постусловие, вызывая create_directory () для любого элемента p, который не существует.
Постусловие: is_directory (p)
Мы показали, что постусловие заранее верно, так почему же оно терпит неудачу?
Редактировать: я использую Boost 1.63. Теперь я вижу, что фиксация «Fix # 12495» три месяца назад, вероятно, вызывает эту проблему: https://github.com/boostorg/filesystem/commit/216720de55359828c2dc915b50e6ead44e00cd15 — и даже включает в себя модульный тест, который требует, чтобы create_directories(".")
должен потерпеть неудачу в то время как create_directory(".")
должен преуспеть, что странно.
Задача ещё не решена.
Других решений пока нет …