初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 950

 

ありがとうございました。そこそこ簡単なので、Win APIでないと無理か?

 
Aleksey Vyazmikin:

ありがとうございました。そこそこ簡単なので、Win APIでないと無理か?

この場合、MQL5のドキュメントを読んでください。

 
Aleksey Vyazmikin:

ありがとうございました。そんな単純な話じゃないから、Win APIがないとできないの?

何がそんなに複雑なんだ?2段落読んで、すべて納得。

1. 指定されたディレクトリ、Commonまたはターミナルフォルダ 内のALL ANYファイルを検索します。ひとつひとつに道をつけていくのです。

2.このラインで作業してください。この行で指定されたフォルダを探し、指定されたフォルダ名が何回出てくるかを数える。これは、フォルダとそのサブフォルダ内のファイル数になります。

 
Aleksey Vyazmikin:
指定されたディレクトリMQL5Filesに含まれるディレクトリのリストを取得する方法を教えてください。
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:

ありがとうございます。しかし、特定のサブディレクトリ内のディレクトリを取得する方法がわかりません。例えば、MQL5Filesに「test」ディレクトリがあることは知っているので、その中のディレクトリを見る必要があるのです。

 
Aleksey Vyazmikin:

ありがとうございます。しかし、特定のサブディレクトリ内のディレクトリを取得する方法がわかりません。例えば、MQL5Filesに「test」ディレクトリがあることは知っているので、その中のディレクトリを見る必要があるのです。

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

ということでやってみたが、そこにはファイルも表示されている...ファイルとフォルダをどう区別 するのかが不明である。

理由: