Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 950

 

Спасибо! Что-то там все не просто, значит без Win API никак?

 
Aleksey Vyazmikin:

Спасибо! Что-то там все не просто, значит без Win API никак?

Тогда из документации MQL5: 

 
Aleksey Vyazmikin:

Спасибо! Что-то там все не просто, значит без Win API никак?

Что-же там сложного? Я прочёл два абзаца и всё стало понятно.

1. Ищешь ВСЕ ЛЮБЫЕ файлы в указанной директории, Common или в папке терминала. Получаешь путь к ним, поочерёдно.

2. Работаешь с полученной строкой. Ищешь в этой строке заданную папку и считаешь сколько раз встречалось имя указанной папки. Это и будет количество файлов в папке и её подпапках.

 
Aleksey Vyazmikin:
Подскажите, пожалуйста, как получить список директорий в указанной директории MQL5\Files ?
string GetDirectory( const string FileName )
{
  int Pos = ::StringFind(FileName, "\\");
  int LastPos = Pos;

  while (Pos >= 0)
  {
    LastPos = Pos;

    Pos = ::StringFind(FileName, "\\", Pos + 1);
  }

  return((LastPos >= 0) ? ::StringSubstr(FileName, 0, LastPos + 1) : "");
}

// Получает список всех директорий (c поддиректориями) песочницы
int GetDirectories( string &Directories[], int Pos = 0, string Filter = "*", const int Common_Flag = 0 )
{
  string FileName;
  const long handle = ::FileFindFirst(Filter, FileName, Common_Flag);

  if (handle != INVALID_HANDLE)
  {
    const string Directory = ::GetDirectory(Filter);
    Filter = ::StringSubstr(Filter, ::StringLen(Directory));

    do
    {
      const string TmpFileName = Directory + FileName;

      if (!::FileIsExist(TmpFileName, Common_Flag) && (::GetLastError() == ERR_FILE_IS_DIRECTORY)) // https://www.mql5.com/ru/forum/1111/page2337#comment_9723503
      {
        ::ResetLastError();
        
        ::ArrayResize(Directories, Pos + 1, 10000);
        Directories[Pos] = TmpFileName;
        Pos++;

        Pos = ::GetDirectories(Directories, Pos, TmpFileName + Filter, Common_Flag);
      }
    }
    while (::FileFindNext(handle, FileName));

    ::FileFindClose(handle);
  }

  return(Pos);
}

void OnStart()
{
  string Folders[];
  
  GetDirectories(Folders);
  
  ArrayPrint(Folders);
}

Выдрано отсюда. Возможно, другие функции там будут полезны.

MQL5 Site / file.mqh - Скачать бесплатно скрипт 'ThirdPartyTicks' от 'fxsaber' для MetaTrader 5 в MQL5 Code Base
  • www.mql5.com
class FILE { private:   static int GetFileNames( string &FileNames[], int Pos = 0, string Filter = "*", const int Common_Flag = 0 )   {       string FileName;       const long handle = ::FileFindFirst(Filter, FileName, Common_Flag);       if (handle != INVALID_HANDLE)       {         const string Directory = FILE::GetDirectory(Filter...
 
Vladimir Karputov:

Тогда из документации MQL5: 

Спасибо, но пока затрудняюсь с применением...

 
fxsaber:

Выдрано отсюда. Возможно, другие функции там будут полезны.

Спасибо, код работает! А как получить только в указанной директории названия директорий, без глубинного ветвления и названия файлов?

 
Aleksey Vyazmikin:

Спасибо, код работает! А как получить только в указанной директории названия директорий, без глубинного ветвления и названия файлов?

//        Pos = ::GetDirectories(Directories, Pos, TmpFileName + Filter, Common_Flag);
 
fxsaber:

Спасибо, но не могу сообразить как получить в конкретной поддиректории директории, т.е. известно что в MQL5\Files есть директория "test" и мне надо в ней посмотреть на директории.

 
Aleksey Vyazmikin:

Спасибо, но не могу сообразить как получить в конкретной поддиректории директории, т.е. известно что в MQL5\Files есть директория "test" и мне надо в ней посмотреть на директории.

  GetDirectories(Folders, 0, "test\\*");
 
fxsaber:

Так и сделал, но попадают ещё и файлы туда в список... как отличить файлы от папок - неясно.

Причина обращения: