Аналог CreateDirectoryA для Linux

204
06 декабря 2018, 23:00

Посоветуйте аналог CreateDirectoryA для Линукса. Заранее спасибо.

Answer 1
#include <boost/filesystem.hpp>
//...
boost::filesystem::create_directories("/any/dir/a/b/c");

А вообще, в Linux есть mkdir, и system() - которые позволят вам сделать следующее:

system("mkdir -p /any/dir/a/b/c")

Взял код с enSO:

Автор утверждает, что код работает и на вантузе и на Linux:

#include <iostream>
#include <string>
#include <sys/stat.h> // stat
#include <errno.h>    // errno, ENOENT, EEXIST
#if defined(_WIN32)
#include <direct.h>   // _mkdir
#endif
bool isDirExist(const std::string& path)
{
#if defined(_WIN32)
    struct _stat info;
    if (_stat(path.c_str(), &info) != 0)
    {
        return false;
    }
    return (info.st_mode & _S_IFDIR) != 0;
#else 
    struct stat info;
    if (stat(path.c_str(), &info) != 0)
    {
        return false;
    }
    return (info.st_mode & S_IFDIR) != 0;
#endif
}
bool makePath(const std::string& path)
{
#if defined(_WIN32)
    int ret = _mkdir(path.c_str());
#else
    mode_t mode = 0755;
    int ret = mkdir(path.c_str(), mode);
#endif
    if (ret == 0)
        return true;
    switch (errno)
    {
    case ENOENT:
        // parent didn't exist, try to create it
        {
            int pos = path.find_last_of('/');
            if (pos == std::string::npos)
#if defined(_WIN32)
                pos = path.find_last_of('\\');
            if (pos == std::string::npos)
#endif
                return false;
            if (!makePath( path.substr(0, pos) ))
                return false;
        }
        // now, try to create again
#if defined(_WIN32)
        return 0 == _mkdir(path.c_str());
#else 
        return 0 == mkdir(path.c_str(), mode);
#endif
    case EEXIST:
        // done!
        return isDirExist(path);
    default:
        return false;
    }
}
int main(int argc, char* ARGV[])
{
    for (int i=1; i<argc; i++)
    {
        std::cout << "creating " << ARGV[i] << " ... " << (makePath(ARGV[i]) ? "OK" : "failed") << std::endl;
    }
    return 0;
}

Usage:

$ makePath 1/2 folderA/folderB/folderC
creating 1/2 ... OK
creating folderA/folderB/folderC ... OK

Оффтоп: я начинаю приунывать, когда вижу погроммистов, которые начинают погроммировать на винде(

READ ALSO
Программа странно работает

Программа странно работает

столкнулся с тем, что у меня программа работает неправильно если я "просто" запускаю её на выполнениеНо если поставить в IDE брейкпоинты, то она...

203
Битовые операции, проверка битов

Битовые операции, проверка битов

Использую битовые операции для опций в GUI, возникла необходимость проверить установлен ли хоть 1 битПравильно ли я понимаю что если число...

181
Ошибка C++ , консоль

Ошибка C++ , консоль

Решил попробовать себя в c++, но первая проблема не дает мне покоя

166
С++ Экономичней ли по времени/памяти передача базовых типов по ссылке?

С++ Экономичней ли по времени/памяти передача базовых типов по ссылке?

Допустим, будет ли выигрыш по времени выполнения/памяти во втором случае или нет?

155