2012-05-01 89 views
7

tôi cần phải sử dụng mkdir C++ chức năng trong VS 2008 mà phải mất hai đối số và bị phản đối từ VS 2005.mkdir C++ chức năng

Tuy nhiên chức năng này được sử dụng trong mã của chúng tôi và tôi cần phải viết một sản phẩm độc lập (có chứa chỉ chức năng mkdir) để gỡ lỗi một cái gì đó.

Tôi cần nhập các tệp tiêu đề nào? Tôi sử dụng direct.h, tuy nhiên trình biên dịch phàn nàn rằng các đối số không có 2 đối số (lý do cho điều này là chức năng đã bị phản đối trong VS 2005).

mkdir("C:\hello",0); 

Trả lời

11

Nếu bạn muốn viết mã cross-platform, bạn có thể sử dụng boost::filesystem thói quen

#include <boost/filesystem.hpp> 
boost::filesystem::create_directory("dirname"); 

này thêm một sự phụ thuộc thư viện nhưng rất có thể là bạn sẽ sử dụng thói quen hệ thống tập tin khác nữa và boost::filesystem có một số lớn giao diện cho điều đó.

Nếu bạn chỉ cần tạo một thư mục mới và nếu bạn chỉ sử dụng VS 2008, bạn có thể sử dụng _mkdir() như những người khác đã lưu ý.

+0

+1 Đi cho nền tảng chéo bất cứ khi nào có thể. – pmr

+3

ISO C++ không phải là nền tảng chéo? Tại sao thêm phụ thuộc tăng cường ở đây? Tôi sẽ không -1 hoặc bất cứ điều gì, nhưng điều này là quá mức cần thiết. Tại sao thêm phụ thuộc lib thời gian liên kết chỉ để thêm thư mục? Tăng cường hệ thống tập tin là * không * tập tin tiêu đề chỉ, bạn biết. –

+0

Tôi đã tránh các hàm liên quan đến hệ thống tập tin vì chúng chủ yếu là hệ thống/trình biên dịch cụ thể. Tôi không chắc chắn về 'mkdir()' nhưng bạn có thể chỉ cho tôi đến một tài liệu tham khảo, nơi điều này được định nghĩa là tiêu chuẩn ISO C++? – Tibor

7

Không được dùng nữa, nhưng tuân thủ ISO C++ _mkdir() đã thay thế, vì vậy hãy sử dụng phiên bản đó. Tất cả bạn cần phải gọi nó là tên thư mục, lập luận duy nhất của nó:

#include <direct.h> 

void foo() 
{ 
    _mkdir("C:\\hello"); // Notice the double backslash, since backslashes 
         // need to be escaped 
} 

Đây là nguyên mẫu từ MSDN:

int _mkdir (const char * dirname);

+3

Chết tiệt, ninja'd. – Electro

+1

@Electro, gõ nhanh hơn, :) –

6

My giải pháp đa nền tảng (recursive):

#include <sstream> 
#include <sys/stat.h> 

// for windows mkdir 
#ifdef _WIN32 
#include <direct.h> 
#endif 

namespace utils 
{ 
    /** 
    * Checks if a folder exists 
    * @param foldername path to the folder to check. 
    * @return true if the folder exists, false otherwise. 
    */ 
    bool folder_exists(std::string foldername) 
    { 
     struct stat st; 
     stat(foldername.c_str(), &st); 
     return st.st_mode & S_IFDIR; 
    } 

    /** 
    * Portable wrapper for mkdir. Internally used by mkdir() 
    * @param[in] path the full path of the directory to create. 
    * @return zero on success, otherwise -1. 
    */ 
    int _mkdir(const char *path) 
    { 
    #ifdef _WIN32 
     return ::_mkdir(path); 
    #else 
    #if _POSIX_C_SOURCE 
     return ::mkdir(path); 
    #else 
     return ::mkdir(path, 0755); // not sure if this works on mac 
    #endif 
    #endif 
    } 

    /** 
    * Recursive, portable wrapper for mkdir. 
    * @param[in] path the full path of the directory to create. 
    * @return zero on success, otherwise -1. 
    */ 
    int mkdir(const char *path) 
    { 
     std::string current_level = ""; 
     std::string level; 
     std::stringstream ss(path); 

     // split path using slash as a separator 
     while (std::getline(ss, level, '/')) 
     { 
      current_level += level; // append folder to the current level 

      // create current level 
      if (!folder_exists(current_level) && _mkdir(current_level.c_str()) != 0) 
       return -1; 

      current_level += "/"; // don't forget to append a slash 
     } 

     return 0; 
    } 
} 
+0

Có lỗi trong mã ở trên trong hàm folder_exists. Bạn nên kiểm tra mã trả về lỗi khi bạn gọi hàm stat. Nếu nó trả về -1, có lỗi. Trên Visual Studio 2010 (ít nhất), hàm sẽ trả về -1 nếu thư mục không tồn tại và tất cả cờ sẽ được đặt thành 1. tôi đề nghị bạn chỉnh sửa này: int ret = stat (dirPath.c_str(), &st); \t \t \t return (ret == 0) && (st.st_mode & S_IFDIR) đúng:? False; này hoạt động một cách chính xác . –