2013-09-08 22 views
13

Tôi hiện đang viết một trình trích xuất cho lưu trữ hệ thống tệp cơ bản ảo (không nén).Cách tạo thư mục tự động bằng cách sử dụng dòng

Trình giải nén của tôi đang gặp sự cố khi ghi tệp vào thư mục không tồn tại.

Extract chức năng:

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 là file gốc vfs, offset là giá trị khi các tập tin khởi động, length là chiều dài tập tin và path là một giá trị từ tập tin những gì lưu offsets len, vv

Ví dụ: đường dẫn là dữ liệu/char/actormotion.txt.

Cảm ơn.

+0

đó là không thể với một 'std :: ofstream', nó chỉ ghi tập tin. Có lẽ một trình bao bọc tốt để tạo thư mục trên nền tảng tùy ý trong 'tăng'. – stefan

+0

@WhozCraig sẽ rất khó vì lưu trữ này có 20 000 tệp trong các thư mục khác nhau. –

Trả lời

26

ofstream không bao giờ tạo thư mục. Trong thực tế, C++ không cung cấp một cách tiêu chuẩn để tạo một thư mục.

Bạn có thể sử dụng dirnamemkdir trên hệ thống Posix hoặc hệ điều hành Windows tương đương hoặc Boost.Files. Về cơ bản, bạn nên thêm một số mã ngay trước khi gọi đến ofstream, để đảm bảo rằng thư mục tồn tại bằng cách tạo nó nếu cần.

+4

+1 lưu ý về C++ không có cách thức tiêu chuẩn để tạo các thư mục hệ thống tập tin thường là một cú sốc đối với mọi người. Rất vui được đề cập đến nó. – WhozCraig

+0

cảm ơn vì điều này. tôi không có ý tưởng..với mã của tôi trong nhiều giờ cố gắng để hiểu những gì địa ngục xảy ra. tôi có thể viết các tập tin trong nhiều ngày và nó đột nhiên dừng lại. Didnt nhận ra có một đoạn mã khác đã xử lý việc tạo thư mục .. –

+0

[Một cách tiêu chuẩn để tạo các thư mục] (http://en.cppreference.com/w/cpp/filesystem/create_directory) đã được thêm cùng với ' std :: filesystem' library trong C++ 17. Hiện tại không có trình biên dịch nào hỗ trợ đầy đủ và chính thức (http://en.cppreference.com/w/cpp/compiler_support#C.2B.2B17_features). – ebk

14

của nó không thể với ofstream để kiểm tra sự tồn tại của một thư mục

có thể sử dụng thay vì 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

Các phương pháp này hiện là một phần của tiêu chuẩn và hiện có sẵn trong hệ thống tệp 'std :: experimental :: filesystem' – Paul

4

Tạo một thư mục với ofstream là không thể. Nó chủ yếu được sử dụng cho các tập tin. Có hai giải pháp dưới đây:

Giải pháp 1:

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

Giải pháp 2:

#include <windows.h> 
int _tmain() { 
    CreateDirectory("MyDir", NULL); 
} 
Các vấn đề liên quan