Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 950

 

Gracias. No es tan fácil allí, así que no hay manera de hacerlo sin Win API?

 
Aleksey Vyazmikin:

Gracias. No es tan fácil allí, así que no hay manera de hacerlo sin Win API?

En este caso, lea la documentación de MQL5:

 
Aleksey Vyazmikin:

Gracias. No es tan sencillo, ¿entonces no se puede hacer sin Win API?

¿Qué tiene de complicado? Leo dos párrafos y todo tiene sentido.

1. buscar TODOS los archivos en un directorio especificado, carpeta común o terminal. Se obtiene el camino hacia ellos, uno por uno.

2. Trabaja con esta línea. Busque la carpeta especificada en esta línea y cuente cuántas veces aparece el nombre de la carpeta especificada. Este será el número de archivos en la carpeta y sus subcarpetas.

 
Aleksey Vyazmikin:
¿Puede decirme cómo obtener una lista de directorios en el directorio 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);
}

Tomado de aquí. Tal vez otras funciones sean útiles allí.

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:

A continuación, desde la documentación de MQL5:

Gracias, pero es difícil de aplicar todavía...

 
fxsaber:

Tomado de aquí. Tal vez las otras funciones que hay sean útiles.

¡Gracias, el código funciona! ¿Y cómo obtener sólo los nombres de los directorios en el directorio especificado, sin la ramificación en profundidad y los nombres de los archivos?

 
Aleksey Vyazmikin:

¡Gracias, el código funciona! Pero, ¿cómo obtener sólo los nombres de los directorios en el directorio especificado, sin la ramificación de profundidad y los nombres de los archivos?

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

Gracias, pero no puedo averiguar cómo obtener un directorio en un subdirectorio específico, es decir, sé que MQL5\Files tiene un directorio de "prueba" y necesito mirar los directorios en él.

 
Aleksey Vyazmikin:

Gracias, pero no puedo averiguar cómo obtener un directorio en un subdirectorio específico, es decir, sé que MQL5\Files tiene un directorio de"prueba" y necesito mirar los directorios en él.

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

Así lo hice, pero los archivos también aparecen allí... no está claro cómo distinguir los archivos de las carpetas.

Razón de la queja: