Проверьте путь к папке - PullRequest
2 голосов
/ 06 июня 2011

Я пытаюсь проверить, существует ли указанный путь. Если это не так, я бы хотел создать папку с именем, указанным в том же каталоге.

Допустим, pathOne: "/ home / music / A" и pathTwo: "/ home / music / B", так что папка A существует, а папка B - нет. Ничего не происходит, если указанный пользователем путь - pathOne, но если pathTwo, то программа должна понимать, что его нет в / home, и должна его создать.

Я знаю, что можно проверить существование из файлов (с помощью fopen это можно сделать), но я не знаю, как это сделать для папок!

Ответы [ 4 ]

4 голосов
/ 06 июня 2011

Windows имеет довольно нестабильную поддержку POSIX, но это одна из тех вещей, которые она может сделать, поэтому мое решение подходит для Linux / Mac / POSIX / Windows):

bool directory_exists( const std::string &directory )
{
    if( !directory.empty() )
    {
        if( access(directory.c_str(), 0) == 0 )
        {
            struct stat status;
            stat( directory.c_str(), &status );
            if( status.st_mode & S_IFDIR )
                return true;
        }
    }
    // if any condition fails
    return false;
}
bool file_exists( const std::string &filename )
{
    if( !filename.empty() )
    {
        if( access(filename.c_str(), 0) == 0 )
        {
           struct stat status;
           stat( filename.c_str(), &status );
           if( !(status.st_mode & S_IFDIR) )
               return true;
        }
    }
    // if any condition fails
    return false;
}

Обратите внимание, что вы можете легко изменить аргумент на const char*, если вы предпочитаете это.

Также обратите внимание, что символические ссылки и тому подобное можно добавлять в зависимости от платформы, проверяя различные значения status.st_mode.

3 голосов
/ 06 июня 2011

Вы должны быть в состоянии использовать Функция Boost Filesystem Существует .Он также переносим.

Существует очень хорошее руководство, описывающее этот сценарий, под названием Использование запросов состояния для определения существования и типа файла - (tut2.cpp)

3 голосов
/ 06 июня 2011

Вы можете использовать функцию opendir из 'dirent.h' и проверять наличие ENOENT в качестве возвращаемого значения.

Этот заголовочный файл недоступен в Windows. В Windows вы используете GetFileAttributes и проверяете INVALID_FILE_ATTRIBUTES в качестве возвращаемого значения.

1 голос
/ 06 июня 2011

посмотрите библиотеку файловой системы boost . У него очень удобный и высокоуровневый интерфейс, например exists(path), is_directory(path) и т. Д.

На уровне ОС Linux вы можете использовать stat .

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