Как создавать каталоги автоматически с использованием потока

Теперь я пишу экстрактор для основного архива виртуальной файловой системы (без сжатия).

У моего экстрактора возникают проблемы при записи файла в каталог, который не существует.

Функция извлечения:

void extract(ifstream * ifs, unsigned int offset, unsigned int length, std::string path)
{
    char * file = new char[length];

    ifs->seekg(offset);
    ifs->read(file, length);

    ofstream ofs(path.c_str(), ios::out|ios::binary);

    ofs.write(file, length);
    ofs.close();

    cout << patch << ", " << length << endl;

    system("pause");

    delete [] file;
}

ifs является корневым файлом vfs, offset - это значение при запуске файла, length - длина файла, а path - значение из файла, что позволяет сохранить смещения len и т.д.

Например, путь - data/char/actormotion.txt.

Благодарю.

Ответ 1

ofstream никогда не создает каталоги. Фактически, C++ не предоставляет стандартный способ создания каталога.

Вы можете использовать dirname и mkdir в системах Posix или эквивалентах Windows или Boost.Filesystem. В принципе, вы должны добавить код непосредственно перед вызовом ofstream, чтобы убедиться, что каталог существует, создав его, если это необходимо.

Ответ 2

Невозможно, чтобы с помощью ofstream проверить наличие каталога

Может использовать boost::filesystem::exists вместо

    boost::filesystem::path dir("path");

    if(!(boost::filesystem::exists(dir))){
        std::cout<<"Doesn't Exists"<<std::endl;

        if (boost::filesystem::create_directory(dir))
            std::cout << "....Successfully Created !" << std::end;
    }

Ответ 3

Создание каталога с потоком невозможно. Он в основном используется для файлов. Ниже приведены два решения:

Решение 1:

#include <windows.h>
int _tmain() {
    //Make the directory
    system("mkdir sample");
}

Решение 2:

#include <windows.h>
int _tmain() {
    CreateDirectory("MyDir", NULL);
}