Как сбросить файловую систему :: current_path() в С++ 17?

Я пишу программу на C++, в которой меняю рабочий каталог на std::filesystem::current_path(working_directory), где working_directory — строка. Есть ли хороший способ позже в программе сбросить рабочий каталог до его исходного значения? Я понимаю, что одним из решений было бы использовать переменную string initial_directory = std::filesystem::current_path() перед изменением рабочего каталога, а затем сбросить ее с помощью std::filesystem::current_path(initial_directory), но я чувствую, что должно быть более элегантное решение.

Спасибо!


person David Bass    schedule 22.07.2021    source источник
comment
Сохранить его и установить обратно - единственный известный мне способ сделать это.   -  person Retired Ninja    schedule 22.07.2021
comment
Я не знаю ничего в файловой системе, которая делала бы то, что вы хотите, и не ожидала бы, что она будет существовать. Политика C++ не заставляет вас платить за вещи, которые вы не просили, и кэширование исходного значения рабочего каталога, чтобы его можно было восстановить позже, было бы ценой, которую должны были бы платить все пользователи файловой системы, если бы они нуждались это или нет. Это может быть вызов API для конкретной цели, но в целях переносимости кэширование исходного значения и его восстановление по мере необходимости кажется наиболее разумным вариантом.   -  person user4581301    schedule 22.07.2021


Ответы (1)


Сделай сам?

#include <iostream>
#include <filesystem>
#include <stack>

static std::stack<std::filesystem::path> s_path;
void pushd(std::filesystem::path path) {
    s_path.push(std::filesystem::current_path());
    std::filesystem::current_path(path);
}
void popd() {
    if (!s_path.empty()) {
        std::filesystem::current_path(s_path.top());
        s_path.pop();
    }
}

int main()
{
    std::cout << "Current path is " << std::filesystem::current_path() << '\n';
    pushd(std::filesystem::temp_directory_path());
    std::cout << "Current path is " << std::filesystem::current_path() << '\n';
    popd();
    std::cout << "Current path is " << std::filesystem::current_path() << '\n';
    popd();
    std::cout << "Current path is " << std::filesystem::current_path() << '\n';
}
person Vlad Feinstein    schedule 22.07.2021
comment
Нет никакой причины делать это в namespace std, это просто создает ненужную путаницу. - person HolyBlackCat; 23.07.2021
comment
Помимо путаницы @HolyBlackCat, это указывает на то, что вы нажимаете что-то, связанное с файловой системой. - person Vlad Feinstein; 23.07.2021
comment
Это также вызывает неопределенное поведение (что здесь в основном формальность, но до сих пор). - person HolyBlackCat; 23.07.2021
comment
@HolyBlackCat - подумав об этом, я нашел stackoverflow.com/questions/41062294/; вернув его, обновит ответ - person Vlad Feinstein; 23.07.2021