Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2016, 12:38   #11
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Причем тут стандарты, boost это библиотека, работает и на старых компиляторах.
вы ж сами говорили что старый стандарт не работал с папками.
Цитата:
Сообщение от Croessmah Посмотреть сообщение
зачем мне целый перечень.

я просил только те которые реализуют эти две

array<String^> ^dirs = Directory::GetDirectories(di->ToString());

array<String^> ^files = Directory::GetFiles(di->ToString());
RAFA91 вне форума Ответить с цитированием
Старый 17.04.2016, 12:39   #12
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от RAFA91 Посмотреть сообщение
вы ж сами говорили что старый стандарт не работал с папками.
в старом стандарте нет встроенных средств, библиотеки никто не отменял.
Цитата:
зачем мне целый перечень.
а прямого аналога нет, дотнет использует их же внутри себя.
просто вернет массив.
на WinAPI вы должны это делать ручками.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.04.2016, 12:40   #13
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
вы ж сами говорили что старый стандарт не работал с папками.
потому что стандартные средства для работы
с файловой системой появятся минимум в C++17.
А значит придется использовать не стандартные,
например boost, из которого как раз многое перекочевывает в стандарт.
Croessmah вне форума Ответить с цитированием
Старый 17.04.2016, 12:44   #14
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

пускай не прямой аналог но аналог.

нужно мне получить массив имен папок и файлов в текущей папке.
RAFA91 вне форума Ответить с цитированием
Старый 17.04.2016, 12:49   #15
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от RAFA91 Посмотреть сообщение
пускай не прямой аналог но аналог.

нужно мне получить массив имен папок и файлов в текущей папке.
ну так напишите сами, для поиска по сути надо 3 функции, + проверка на атрибут возвращенного файла, чтоб отличить папку от файла.
FindFirstFile, FindNextFile, FindClose.
+ атрибут директории FILE_ATTRIBUTE_DIRECTORY.
ну и пример от них же.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.04.2016, 01:09   #16
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от RAFA91 Посмотреть сообщение
пускай не прямой аналог но аналог.

нужно мне получить массив имен папок и файлов в текущей папке.
формально, filesystem узаконят не раньше с++17.

тем не менее, вы можете воспользоваться версией boost,
откуда filesystem мигрирует почти без изменений.
http://rextester.com/EJDIG92610

Код:
// пример рекурсивного обхода в глубину
// дерева каталогов

// при этом используются два способа:
// 1. рекурсивный вызов функций
// 2. цикл с использованием стека

// =====================================================================
// =====================================================================

#include <thread>
 
 
typedef uint64_t MicroSeconds;
 
// вернет промежуток времени в микросекундах
// с момента последнего запуска этого же метода
MicroSeconds QuantMS()
{
    typedef std::chrono::microseconds 
        MSec;
    typedef std::chrono::high_resolution_clock
        Clock;
 
    static Clock::time_point last;
    
    const Clock::time_point now 
        = Clock::now();
    
    const auto result 
        = std::chrono::duration_cast<MSec>(now - last);
 
    last = now;
    
    return static_cast<MicroSeconds>(result.count());
}

// =====================================================================
// =====================================================================

#include <stack>
#include <iostream>
#include <boost/filesystem.hpp>


namespace fs = boost::filesystem;
typedef fs::directory_iterator 
    iter;

const size_t max_depth = 20;


// расскоментируйте этот дефайн,
// что бы активировать показ 
// дополнительной информации
#define dVIEW

#ifdef dVIEW
void view(const char* desc, const fs::path& cur, const size_t depth)
{
    std::cout 
        << "["<< depth << "][" << desc <<"]" << std::string(depth*2, ' ') << cur << std::endl;
}
#else
void view(const char* desc, const fs::path&, const size_t){}
#endif

size_t recursieve(const fs::path& start, const size_t depth = 0)
{
    if(depth>=max_depth)
        return 0;
    
    size_t found = 0;
    for(iter it(start); it != iter(); ++it)
    {
        try
        {
            const fs::path& cur = *it;
            if (fs::is_directory(cur))
                view("[dir]", cur, depth),
                found += recursieve(cur, depth + 1) + 1;
            else
                view("[file]", cur, depth);
        }
        catch (const fs::filesystem_error& ex){ std::cout << ex.what() << '\n'; }
    }
    return found;
}


size_t loop(const fs::path& start, size_t depth = 0)
{
    std::stack<iter>
        mystack;

    size_t found = 0;
    mystack.emplace(start);

    while (!mystack.empty() && depth < max_depth)
    {
        auto& it = mystack.top();

        if(it == iter())
        {
            mystack.pop();
            --depth;
            continue;
        }

        for (; it != iter(); ++it)
        {
            try
            {
                const fs::path& cur = *it;
                if (fs::is_directory(cur))
                {
                    view("dir", cur, depth);
                    mystack.emplace(cur);
                    ++it;
                    ++depth;
                    ++found;
                    break;
                }
                else
                    view("file", cur, depth);
            }
            catch (const fs::filesystem_error& ex) { std::cout << ex.what() << '\n'; }
        }
    }
    return found;
}


void view_statistic(const fs::path& p, const char* desc, size_t scan(const fs::path&, size_t) )
{
    
    std::cout << "method: "<< desc << std::endl
        << "started from: " << p << std::endl;
    
    QuantMS();
    const auto found   = scan(p, 0);
    const auto elapsed = QuantMS();
    
    std::cout << "total found directories: "
        << found << std::endl;
    
    std::cout << "time: " << elapsed << " microseconds ("
        << elapsed/1000000.0 <<" seconds)\n\n\n";
}

int main()
{
    fs::path p = (fs::current_path()/"../../..");
    p.normalize();
    
    //std::cout << "started from: " << p << std::endl;
    
    view_statistic(p, "loop",       loop);
    view_statistic(p, "recursieve", recursieve);
}
либо воспользоваться эксперементальной поддержкой
для компиляторов вижуал студии:
https://msdn.microsoft.com/en-us/library/hh874694.aspx
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с каталогами в дельфи1 Hint_reg Общие вопросы Delphi 1 21.06.2012 16:50
Работа с каталогами в дельфи Hint_reg Общие вопросы Delphi 2 21.06.2012 14:18
Работа с каталогами (С, Linux) neomax38 Помощь студентам 1 26.02.2012 11:23
java работа с каталогами programmm Помощь студентам 0 06.12.2011 20:57
работа с каталогами *.dat dedyshka SQL, базы данных 0 26.01.2010 12:27