Создайте каталог в Windows и проверьте, существует ли он - PullRequest
0 голосов
/ 20 марта 2019

Мне нужно создать несколько каталогов, и когда я пытаюсь найти один, я должен знать, был ли он уже создан.

Проблема в том, что после создания каталога с CreateDirectory() и попытки проверить, был ли он создан, я получаю сообщение об ошибке, в котором говорится, что он не был создан.

Если я закрою и перезапущу программу, не создавая каталог, а просто проверив, создан ли он, все работает.

bool DirectoryExists( const char* absolutePath ){
    if( _access( absolutePath, 0 ) == 0 ){
        struct stat status;
        stat( absolutePath, &status );
        return (status.st_mode & S_IFDIR) != 0;
    }
    return false;
}

marca = "database\\"+marca;
CreateDirectory (marca.c_str(), NULL);
// useless operation
if(! DirectoryExists(marca.c_str() )  )
{
    cout<<" Error !";
    return -1;
}

1 Ответ

0 голосов
/ 20 марта 2019

Если бы marca было "базой данных", это работало бы.Но если marca - это «база данных / foo», вы не можете одновременно создать обоих .

Вот версия вашего кода, в которой я разделяю эти операции.

#include <windows.h>
#include <io.h>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <iostream>

using namespace std;

bool DirectoryExists( const char* absolutePath )
{
    if( _access( absolutePath, 0 ) == 0 ){

        struct stat status;
        stat( absolutePath, &status );

        return (status.st_mode & S_IFDIR) != 0;
    }
    return false;
}

bool MakeDirectory(const string& marca)
{
    if(! CreateDirectory(marca.c_str(), NULL))
    {
        DWORD error = GetLastError();
        TCHAR buf[256];
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
            buf, (sizeof(buf) / sizeof(TCHAR)), NULL);
        cout << "Failed to create directory: " << buf << '\n';
        return false;
    }

    if(! DirectoryExists(marca.c_str() )  )
    {
        cout << "Directory does not exist\n";
        return false;
    }
    return true;
}

int main()
{
    // name of subdirectory
    string marca = "foo"; 

    // first create top directory
    string d = "database";
    MakeDirectory(d);

    // then subdirectory
    d += "/" + marca;
    MakeDirectory(d);

    return 0;

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...