0

Windows と Unix の両方にディレクトリが存在するかどうかを確認するために、次のコードを書きましたが、それが正しいかどうかはわかりません。

int writeFiles(std::string location)
{

        // USED TO FILE SYSTEM OPERATION
        struct stat st;
        // DEFINE THE mode WHICH THE FILE WILL BE CREATED
        const char * mode = "w+b";
        /* local curl variable */

        // CHECK IF THE DIRECTORY TO WHERE THE FILE ARE GOING EXIST
        // IF NOT, CREATE IT
        if(stat(location.c_str(), &st) != 0){
                #ifndef (defined  _WIN32 || defined __WIN64)    /* WIN32 SYSTEM */
                if (!CreateDirectory(location.c_str(), NULL)){
                        std::string msg("The location directory did not exists, can't be created\n");
                        throw std::runtime_error(msg);
                }
                #elif defined __unix__          /* in the case of unix system */
                if(mkdir(location.c_str(), S_IRWXU) != 0){
                        std::string msg("The dest_loc directory did not exist, can't be created\n");
                        throw std::runtime_error(msg);
                }
                #endif

 ... more code down here.

locationファイルがコピーされるはずの場所へのパスです。ただし、ファイルのコピーを開始する前に、Windows と Linux の両方でディレクトリが存在するかどうかを確認する必要があります。誰かが私にその問題についての意見を教えてもらえますか? ありがとう

4

4 に答える 4

4

プリプロセッサディレクティブ(Microsoft Predefinedマクロのリストを参照)私は次のように書きます:

#ifdef _WIN32

#else

// Assume UNIX system,
// depending on what you are compiling your code on,
// by that I mean you only building on Windows or UNIX
// (Linux, Solaris, etc) and not on Mac or other.
#endif

ディレクトリがすでに存在する場合は失敗(return)しますが、最後のエラーはに設定されCreateDirectory()ます。これを正しく処理するには、の使用法を変更してください。FALSEERROR_ALREADY_EXISTSCreateDirectory()

if (!CreateDirectory(location.c_str(), NULL) &&
    ERROR_ALREADY_EXISTS != GetLastError())
{
    // Error message more useful if you include last error code.
    std::ostringstream err;
    err << "CreateDirectory() failure on "
        << location
        << ", last-error="
        << GetLastError();

    throw std::runtime_exception(err.str());
}

boost::filesystemそうは言っても、ブーストにアクセスできる場合は、ライブラリの使用を検討してください。

于 2012-07-05T15:14:59.680 に答える
2

変更する必要があります:

            #ifndef (defined  _WIN32 || defined __WIN64)    /* WIN32 SYSTEM */

に:

            #if (defined _WIN32 || defined __WIN64)    /* WIN32 SYSTEM */

_WIN32これは、またはが定義されているかどうかをテスト__WIN64し、定義されている場合は WINAPI コードを使用します。

おそらく変更することもできます:

            #elif defined __unix__          /* in the case of unix system */

だけに:

            #else          /* in the case of non-Windows system */

Windows 以外のほとんどの OS には、POSIX 風の APImkdirなどがある可能性が高く、現在、他の OS 固有のコードはありません。

于 2012-07-05T16:19:56.173 に答える
1

ファイルシステムと対話するクロスプラットフォーム コードを作成する必要がある場合は、 Boost FileSystemなどのクロスプラットフォーム ファイルシステム API を使用します。

于 2012-07-05T15:12:45.033 に答える
0

Windows に があると仮定できる場合stat()、なぜ も使用できないのでしょmkdir()うか?

しかし実際には、Windows ではCreateDirectory無条件に呼び出して (前のstat呼び出しなしで)、GetLastError()が返されるかどうかを確認できますERROR_ALREADY_EXISTS

また、std::stringANSI 関数CreateDirectoryA. マクロを使用すると、 CreateDirectoryUnicode の不一致が発生する可能性があります。

于 2012-07-05T15:18:19.727 に答える