16

VS2008でmkdirc++関数を使用する必要があります。これは、2つの引数を取り、VS2005で非推奨になりました。

ただし、この関数はコードで使用されており、何かをデバッグするためにスタンドアロン製品(mkdir関数のみを含む)を作成する必要があります。

どのヘッダーファイルをインポートする必要がありますか?direct.hを使用しましたが、コンパイラーは引数が2つの引数をとらないと文句を言います(この理由は、関数がVS 2005で非推奨になったためです)。

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

4 に答える 4

21

クロスプラットフォームのコードを記述したい場合は、boost::filesystemルーチンを使用できます

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

これによりライブラリの依存関係が追加されますが、他のファイルシステムルーチンも使用する可能性がありboost::filesystem、そのための優れたインターフェイスがいくつかあります。

新しいディレクトリを作成するだけで、VS 2008のみを使用する場合は_mkdir()、他の人が指摘しているように使用できます。

于 2012-05-01T18:45:34.503 に答える
11

非推奨ですが、ISO C ++準拠_mkdir()で置き換えられたため、そのバージョンを使用してください。あなたがそれを呼ぶ必要があるのはディレクトリ名、その唯一の引数です:

#include <direct.h>

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

これがMSDNのプロトタイプです:

int _mkdir(const char * dirname);

于 2012-05-01T18:45:10.617 に答える
9

私のクロスプラットフォームソリューション(再帰的):

#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;
    }
}
于 2012-09-10T18:10:46.573 に答える
7

最近は_mkdir()機能があります。

于 2012-05-01T18:45:16.980 に答える