Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 950

 

Grazie! Non è così facile lì, quindi non c'è modo di farlo senza Win API?

 
Aleksey Vyazmikin:

Grazie! Non è così facile lì, quindi non c'è modo di farlo senza Win API?

In questo caso, leggete la documentazione di MQL5:

 
Aleksey Vyazmikin:

Grazie! Non è così semplice, quindi non si può fare senza Win API?

Cosa c'è di così complicato? Ho letto due paragrafi e tutto ha senso.

1. cerca TUTTI i file QUALSIASI in una directory specificata, Common o cartella terminale. Si ottiene il percorso verso di loro, uno per uno.

2. Lavora con questa linea. Cerca la cartella specificata in questa linea e conta quante volte ricorre il nome della cartella specificata. Questo sarà il numero di file nella cartella e nelle sue sottocartelle.

 
Aleksey Vyazmikin:
Potete per favore dirmi come ottenere una lista di directory nella directory specificata 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);
}

Preso da qui. Forse altre funzioni saranno utili lì.

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:

Poi dalla documentazione di MQL5:

Grazie, ma è difficile da applicare ancora...

 
fxsaber:

Preso da qui. Forse le altre funzioni lì saranno utili.

Grazie, il codice funziona! E come ottenere solo i nomi delle directory nella directory specificata, senza ramificazioni di profondità e nomi di file?

 
Aleksey Vyazmikin:

Grazie, il codice funziona! Ma come ottenere solo i nomi delle directory nella directory specificata, senza ramificazioni di profondità e nomi di file?

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

Grazie, ma non riesco a capire come ottenere una directory in una specifica sottodirectory, cioè so che MQL5\Files ha una directory "test" e ho bisogno di guardare le directory in essa.

 
Aleksey Vyazmikin:

Grazie, ma non riesco a capire come ottenere una directory in una specifica sottodirectory, cioè so che MQL5\Files ha una directory"test" e ho bisogno di guardare le directory in essa.

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

Così ho fatto, ma i file sono elencati anche lì... come distinguere i file dalle cartelle non è chiaro.