2013-09-08 2 views
13

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

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

функция

Extract:

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 и т.д.

Например, путь - это данные/char/actormotion.txt.

Спасибо.

+0

это не возможно, с 'станд :: ofstream', это только для записи файлов. Вероятно, есть хорошая оболочка для создания каталогов на произвольной платформе в 'boost'. – stefan

+0

@WhozCraig будет сложно, потому что в этом архиве было 20 000 файлов в разных каталогах. –

ответ

26

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

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

+4

+1 примечание о C++, не имеющее стандартного способа создания каталогов файловой системы, часто становится шоком для людей. Приятно отметить это. – WhozCraig

+0

спасибо за это. я понятия не имел ... часами пытаюсь понять, что случилось. я мог писать файлы в течение нескольких дней, и это внезапно прекратилось. Не понял, что есть еще один фрагмент кода, который позаботился о создании папки. –

+0

[Стандартный способ создания каталогов] (http://en.cppreference.com/w/cpp/filesystem/create_directory) был добавлен вместе с ' std :: filesystem' в C++ 17. В настоящее время [компилятор не поддерживал его полностью и официально] (http://en.cppreference.com/w/cpp/compiler_support#C.2B.2B17_features). – ebk

14

не возможно с 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; 
    } 
+1

Эти методы теперь являются частью стандарта и доступны в настоящее время в разделе 'std :: experimental :: filesystem' – Paul

4

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

Решение 1:

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

Решение 2:

#include <windows.h> 
int _tmain() { 
    CreateDirectory("MyDir", NULL); 
} 
Смежные вопросы