Boost Filesystem не воспринимает путь к фалу macOS

Вечер добрый, такая проблема: написал в Visual Studio код с помощью Boost Filesystem, чтобы определять, существует ли указанный пользователем файл. Сейчас перешел на macOS, суть в том, чтобы в окно терминала закинуть файл, тогда его абсолютный путь автоматически вставляется, так вот моя проблема в том, что в macOS пробел в название обозначается как "\ ", к примеру: "Visual\ Studio\ Repos" и эти бэкслеши мешают определению пути, программа всегда возвращает то, что указанного пути не существует, как можно правильно принять ввод у пользователя, а потом конвертировать его в такой, чтобы Boost::Filesystem понял? Скриншот вывода Терминала


Ответы (3 шт):

Автор решения: schmidt9

Создал консольное приложение, кидаю в консоль путь наподобие такого /Users/user/Desktop/Без\ названия.png, путь распознается успешно

#include <iostream>
#include <boost/filesystem.hpp>

int main(int argc, const char * argv[]) {
    auto path = argv[1];
    auto fileSize = boost::filesystem::file_size(path);
    auto fileExists = boost::filesystem::exists(path);
    std::cout << "\npath: " << path << "\nfile exists: " << fileExists << "\nsize: " << fileSize << std::endl;
    return 0;
}

Вывод в консоли

path: /Users/user/Desktop/Без названия.png
file exists: 1
size: 1992516
→ Ссылка
Автор решения: scriptSQD

Я нашел решение проблемы своим способом, тоже должен справляться со всеми нестандартными символами ввода, например иногда Windows добавляет в начало и конец пути ковычки ["], fs::path у меня такое тоже не принимал, а т.к. я использую буст, я воспользовался всеми его прелестями, сделал пользовательский ввод в виде обычной строки, а затем использовал такую функцию:

    std::string normalizeStringForPath(std::string replaceIn) {
        boost::replace_all(replaceIn, "\\ ", " ");
        if (boost::ends_with(replaceIn, "\"")) {
            replaceIn.erase(replaceIn.end() - 1, replaceIn.end());
        }
        if (boost::starts_with(replaceIn, "\"")) {
            replaceIn.erase(replaceIn.begin(), replaceIn.begin() + 1);
        }
        cout << replaceIn;
        return replaceIn;
    };

Мой же прием пользовательского ввода выглядит примерно так:

int main() {
        fs::path dsdtPath;
        std::string dsdtPathStr;
        getline(cin, dsdtPathStr);
        dsdtPath = normalizeStringForPath(dsdtPathStr);
}
→ Ссылка
Автор решения: Ivan Kramarchuk

Если вы используете C++ 17 или выше, используйте стандартную библиотеку std::filesystem вместо boost, это намного удобнее и тоже полностью кроссплатформено.

Если вы хотите передать путь в вашу программу как аргумент, просто заключите его в кавычки, например: ls "/Library/Application Support/Apple"

→ Ссылка