Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 950

 

Obrigado! Não é tão fácil lá, então não há maneira de o fazer sem Win API?

 
Aleksey Vyazmikin:

Obrigado! Não é tão fácil lá, então não há maneira de o fazer sem Win API?

Neste caso, leia a documentação da MQL5:

 
Aleksey Vyazmikin:

Obrigado! Não é assim tão simples, então não o pode fazer sem Win API?

O que há de tão complicado nisso? Li dois parágrafos e tudo isto faz sentido.

1. procurar por TODOS OS ficheiros num directório especificado, pasta Comum ou terminal. Consegue-se o caminho até eles, um a um.

2. Trabalhar com esta linha. Procure a pasta especificada nesta linha e conte quantas vezes o nome da pasta especificada ocorre. Este será o número de ficheiros na pasta e nas suas subpastas.

 
Aleksey Vyazmikin:
Pode por favor dizer-me como obter uma lista de directórios no directório especificado 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);
}

Tirada a partir daqui. Talvez outras funções sejam aí úteis.

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:

Depois a partir da documentação MQL5:

Obrigado, mas ainda é difícil de aplicar...

 
fxsaber:

Tirada a partir daqui. Talvez as outras funções aí existentes sejam úteis.

Obrigado, o código funciona! E como obter apenas os nomes dos directórios no directório especificado, sem ramificações de profundidade e nomes de ficheiros?

 
Aleksey Vyazmikin:

Obrigado, o código funciona! Mas como obter apenas os nomes dos directórios no directório especificado, sem ramificações de profundidade e nomes de ficheiros?

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

Obrigado, mas não consigo descobrir como obter um directório num subdirectório específico, ou seja, sei que a MQL5\Files tem um directório "teste" e preciso de ver os directórios nele contidos.

 
Aleksey Vyazmikin:

Obrigado, mas não consigo descobrir como obter um directório num subdirectório específico, ou seja, sei que a MQL5\Files tem um directório"teste" e preciso de ver os directórios nele contidos.

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

Assim o fiz, mas os ficheiros também estão aí listados... como distinguir ficheiros de pastas não é claro.