【MQL5】FolderCreate関数について

MQL5リファレンス
スポンサーリンク
スポンサーリンク

FolderCreate関数の働き・役割

FolderCreate関数は、新しいフォルダを作成するための関数です。この関数を使用すると、Filesディレクトリ内に指定した名前のフォルダを作成できます。また、common_flagパラメータを設定することにより、フォルダの作成先をローカルフォルダまたは全てのクライアント端末の共有フォルダに切り替えることが可能です。

たとえば、common_flagの値がFILE_COMMONの場合、フォルダは全てのクライアント端末で共有されるディレクトリ(Terminal\Common\Files)に作成されます。それ以外のケースでは、ローカル環境に対応したフォルダ(MQL5\Filesまたはテスト環境の場合MQL5\Tester\Files)に作成されます。

FolderCreate関数の引数について

bool  FolderCreate(
  string  folder_name,      // 新しいフォルダの名称
  int    common_flag=0      // 範囲
  );

FolderCreate関数は、以下の2つの引数を受け取ります。

第1引数: folder_name

新しく作成するフォルダの名前を指定します。フォルダ名には、Filesディレクトリ内での相対パスを指定する必要があります。たとえば、「MyFolder」という名前を指定すると、Filesディレクトリ内に「MyFolder」というフォルダが作成されます。

第2引数: common_flag

フォルダを作成する場所を指定するフラグです。この引数は省略可能で、初期値では0が設定されています。以下の設定が可能です。

  • 値が0の場合、フォルダはローカルのMQL5\Filesディレクトリに作成されます。
  • 値がFILE_COMMONの場合、フォルダは全てのクライアント端末で共有されるTerminal\Common\Filesディレクトリに作成されます。

FolderCreate関数の戻り値について

FolderCreate関数は、フォルダの作成に成功したかどうかを示すブール値を返します。

  • フォルダの作成に成功した場合は、trueが返されます。
  • フォルダの作成に失敗した場合は、falseが返されます。

失敗した場合、GetLastError関数を使用してエラーコードを確認することで、失敗の原因を特定することが可能です。

FolderCreate関数を使う際の注意点

MQL5ではセキュリティ上の制約があり、ファイルやフォルダの操作はファイルサンドボックス内でのみ可能です。サンドボックスの外にフォルダを作成することはできません。

FolderCreate関数を使ったサンプルコード

//--- スクリプトの実行時に入力パラメータウィンドウを表示するプロパティを設定
#property script_show_inputs

//--- スクリプトが動作するフォルダの場所を定義する入力パラメータ
// common_folderがtrueの場合、全ての端末で共有されるフォルダにフォルダを作成する
input bool common_folder=false; // 共有フォルダを使用するかどうかのフラグ

//+------------------------------------------------------------------+
//| スクリプトの開始関数                                           |
//+------------------------------------------------------------------+
void OnStart()
 {
  //--- MQL5\Filesディレクトリ内に作成するフォルダの名前を定義
  string root_folder="Folder_A";
  
  //--- root_folderという名前のフォルダを作成し、作成が成功したかをチェック
  if(CreateFolder(root_folder,common_folder))
    {
    //--- 成功した場合、さらにサブフォルダを作成する処理を続行
    // 子フォルダB1をroot_folderの中に作成する
    string folder_B1="Child_Folder_B1";
    
    //--- フォルダ名と構造を組み合わせた完全なパスを作成
    string path=root_folder+"\\"+folder_B1;
    
    //--- サブフォルダB1の作成を試み、成功したかを確認
    if(CreateFolder(path,common_folder))
       {
        //--- サブフォルダB1の中にさらに3つのサブフォルダを作成
        //--- サブフォルダC11の作成
        string folder_C11="Child_Folder_C11";
        string child_path=root_folder+"\\"+folder_C11; // フォルダ名と構造を組み合わせる
        CreateFolder(child_path,common_folder); // サブフォルダC11を作成

        //--- サブフォルダC12の作成
        string folder_C12="Child_Folder_C12";
        child_path=root_folder+"\\"+folder_C12; // フォルダ名と構造を組み合わせる
        CreateFolder(child_path,common_folder); // サブフォルダC12を作成
        
        //--- サブフォルダC13の作成
        string folder_C13="Child_Folder_C13";
        child_path=root_folder+"\\"+folder_C13; // フォルダ名と構造を組み合わせる
        CreateFolder(child_path,common_folder); // サブフォルダC13を作成
       }
    }
 }

//+------------------------------------------------------------------+
//| フォルダの作成を試み、結果をメッセージで表示する関数           |
//+------------------------------------------------------------------+
bool CreateFolder(string folder_path,bool common_flag)
 {
  //--- フォルダ作成場所のフラグを設定(common_flagがtrueの場合、FILE_COMMONを使用)
  int flag = common_flag ? FILE_COMMON : 0;

  //--- フォルダの作成先のパスを保存する変数
  string working_folder;

  //--- common_flagの値に基づいてフォルダのフルパスを決定
  if (common_flag)
     // 共有フォルダの場合は、全端末で共有されるパスを使用
     working_folder = TerminalInfoString(TERMINAL_COMMONDATA_PATH) + "\\MQL5\\Files";
  else
     // ローカルフォルダの場合は、ローカルのパスを使用
     working_folder = TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Files";

  //--- デバッグ用メッセージ: 作成しようとしているフォルダのパスを表示
  PrintFormat("folder_path=%s", folder_path);

  //--- MQL5\Filesパスを基準にフォルダを作成し、成功したかどうかを確認
  if (FolderCreate(folder_path, flag))
    {
    //--- 作成したフォルダのフルパスを表示
    PrintFormat("Created the folder %s", working_folder + "\\" + folder_path);
    
    //--- エラーコードをリセット(正常に作成できた場合)
    ResetLastError();
    
    //--- フォルダ作成が成功した場合はtrueを返す
    return true;
    }
  else
    //--- フォルダ作成に失敗した場合、エラーメッセージとエラーコードを表示
    PrintFormat("Failed to create the folder %s. Error code %d", working_folder + folder_path, GetLastError());

  //--- フォルダ作成が失敗した場合はfalseを返す
  return false;
 }

このサンプルコードは、指定された名前のフォルダをMQL5環境のローカルディレクトリまたは全端末で共有される共有フォルダに作成するプログラムです。指定した親フォルダを作成し、その中に複数のサブフォルダを階層構造として作成します。フォルダ作成の成否を確認し、結果に応じてメッセージを出力します。

サンプルコード解説1:グローバル領域部分

//--- スクリプトの実行時に入力パラメータウィンドウを表示するプロパティを設定
#property script_show_inputs

//--- スクリプトが動作するフォルダの場所を定義する入力パラメータ
// common_folderがtrueの場合、全ての端末で共有されるフォルダにフォルダを作成する
input bool common_folder=false; // 共有フォルダを使用するかどうかのフラグ

この部分のコードは、スクリプトが実行される際の設定と入力パラメータの定義を行っています。具体的な役割は以下の通りです。

property script_show_inputs

この行は、スクリプトが実行される際に、入力パラメータウィンドウを表示するように設定しています。スクリプトに入力パラメータが設定されている場合、このウィンドウでユーザーがパラメータを変更できるようになります。

input bool common_folder=false

この行では、スクリプトの動作に影響を与える入力パラメータを定義しています。inputキーワードは、ユーザーがスクリプト実行時に設定できるパラメータを定義するために使われます。この場合、common_folderというブール型のフラグが定義されており、初期値はfalseです。

このフラグがtrueに設定された場合、フォルダは全ての端末で共有される「共有フォルダ」に作成されます。falseのままの場合は、スクリプトが動作するローカル環境のMQL5\Filesディレクトリにフォルダが作成される仕組みです。

このように、common_folderフラグによって、フォルダが作成される場所を動的に切り替えることができるようになっています。

サンプルコード解説2:OnStart関数部分その1

//+------------------------------------------------------------------+
//| スクリプトの開始関数                                           |
//+------------------------------------------------------------------+
void OnStart()
 {
  //--- MQL5\Filesディレクトリ内に作成するフォルダの名前を定義
  string root_folder="Folder_A";
  
  //--- root_folderという名前のフォルダを作成し、作成が成功したかをチェック
  if(CreateFolder(root_folder,common_folder))
    {
    //--- 成功した場合、さらにサブフォルダを作成する処理を続行
    // 子フォルダB1をroot_folderの中に作成する
    string folder_B1="Child_Folder_B1";
    
    //--- フォルダ名と構造を組み合わせた完全なパスを作成
    string path=root_folder+"\\"+folder_B1;

この部分のコードは、スクリプトが開始された際に実行されるOnStart関数の冒頭部分で、フォルダ作成のロジックを定義しています。具体的には、指定したフォルダをMQL5\Filesディレクトリ内に作成する処理を行っています。

OnStart関数

OnStart関数は、スクリプトが実行されたときに最初に呼び出される関数です。この関数内で、フォルダ作成の具体的な処理が記述されています。

root_folderの定義

最初に、root_folderという変数が定義され、フォルダの名前「Folder_A」が代入されています。これは、MQL5\Filesディレクトリ内に作成するフォルダの名称を指定しています。

CreateFolder関数の呼び出し

次に、CreateFolder関数を使用して、root_folderという名前のフォルダを作成します。common_folderフラグ引数として渡し、ローカルフォルダか共有フォルダかを決定します。

この時、フォルダ作成が成功した場合に、サブフォルダをさらに作成する処理へ進みます。

サブフォルダB1の作成

フォルダ作成が成功した後、次にfolder_B1という変数に「Child_Folder_B1」というサブフォルダ名が代入されます。このサブフォルダは、先ほど作成したroot_folderの中に作成されます。

フォルダパスの生成

次に、pathという変数に、root_folderとfolder_B1を組み合わせた完全なパスを生成し、このパスに基づいてサブフォルダを作成する準備を行います。このように、親フォルダとサブフォルダを組み合わせてフォルダ構造を作成していくことが可能です。

サンプルコード解説3:OnStart関数部分その2

 //--- サブフォルダB1の作成を試み、成功したかを確認
    if(CreateFolder(path,common_folder))
       {
        //--- サブフォルダB1の中にさらに3つのサブフォルダを作成
        //--- サブフォルダC11の作成
        string folder_C11="Child_Folder_C11";
        string child_path=root_folder+"\\"+folder_C11; // フォルダ名と構造を組み合わせる
        CreateFolder(child_path,common_folder); // サブフォルダC11を作成

        //--- サブフォルダC12の作成
        string folder_C12="Child_Folder_C12";
        child_path=root_folder+"\\"+folder_C12; // フォルダ名と構造を組み合わせる
        CreateFolder(child_path,common_folder); // サブフォルダC12を作成
        
        //--- サブフォルダC13の作成
        string folder_C13="Child_Folder_C13";
        child_path=root_folder+"\\"+folder_C13; // フォルダ名と構造を組み合わせる
        CreateFolder(child_path,common_folder); // サブフォルダC13を作成
       }
    }
 }

この部分のコードでは、前のステップで作成したサブフォルダB1の中に、さらに3つのサブフォルダ(C11、C12、C13)を作成する処理が行われています。具体的な流れを以下で解説します。

サブフォルダB1の作成結果を確認

まず、前の部分で生成したサブフォルダB1の作成が成功したかどうかを確認しています。CreateFolder関数が正常にフォルダを作成した場合、処理が続行され、B1フォルダの中にさらにサブフォルダを作成する流れとなります。

サブフォルダC11の作成

最初に、folder_C11という変数に「Child_Folder_C11」という名前が代入されます。このサブフォルダ名とroot_folderを組み合わせて、child_pathという変数に完全なパスを生成します。その後、CreateFolder関数を使って、サブフォルダC11をB1フォルダの中に作成します。

サブフォルダC12の作成

次に、folder_C12という変数に「Child_Folder_C12」という名前が代入されます。C11と同様に、child_pathにフォルダパスを生成し、CreateFolder関数を呼び出して、サブフォルダC12をB1フォルダ内に作成します。

サブフォルダC13の作成

最後に、folder_C13という変数に「Child_Folder_C13」という名前が代入されます。先ほどと同様に、フォルダパスを生成してからCreateFolder関数を使って、サブフォルダC13を作成します。

これにより、root_folderで定義されたフォルダ(Folder_A)の中に、B1フォルダとその中にさらに3つのサブフォルダ(C11、C12、C13)を持つ階層構造が完成します。フォルダのパスは動的に生成されており、柔軟にフォルダ構造を定義できます。

サンプルコード解説4:CreateFolder関数(オリジナル関数)部分その1

//+------------------------------------------------------------------+
//| フォルダの作成を試み、結果をメッセージで表示する関数           |
//+------------------------------------------------------------------+
bool CreateFolder(string folder_path,bool common_flag)
 {
  //--- フォルダ作成場所のフラグを設定(common_flagがtrueの場合、FILE_COMMONを使用)
  int flag = common_flag ? FILE_COMMON : 0;

  //--- フォルダの作成先のパスを保存する変数
  string working_folder;

この部分では、フォルダの作成処理を行うCreateFolder関数の最初の部分について解説します。この関数は、指定したパスに基づいてフォルダを作成し、成功したかどうかを判定する役割を持ちます。さらに、関数引数についても詳しく説明します。

CreateFolder関数

この関数は、フォルダを作成するためのオリジナル関数で、外部からフォルダのパスと共有設定を受け取り、フォルダ作成の結果を処理します。関数の戻り値はブール値で、フォルダ作成が成功すればtrue、失敗すればfalseを返します。

引数の説明

folder_path

folder_pathは、作成するフォルダのパスを示す文字列型の引数です。具体的には、フォルダ名やそのフォルダ構造に関するパスを指定します。たとえば、「Folder_A」や「Folder_A\Child_Folder_B1」といった形式の相対パスが使用されます。

common_flag

common_flagは、フォルダをどこに作成するかを決定するフラグです。ブール型の引数で、trueが設定されるとフォルダは全ての端末で共有される「共有フォルダ」に作成され、falseの場合はローカル環境のMQL5\Filesディレクトリに作成されます。

フォルダ作成場所のフラグ設定

common_flagに基づいて、フォルダを作成する場所を指定するために、flag変数が設定されます。common_flagがtrueの場合は、共有フォルダに作成するためにFILE_COMMONが使用され、それ以外の場合はローカルフォルダに作成されるためにフラグが0に設定されます。

フォルダの作成先を保持する変数

working_folderという変数は、実際にフォルダを作成するためのパスを保持します。この変数には、後ほどcommon_flagの値に応じて、フォルダのフルパスが代入されます。

サンプルコード解説5:CreateFolder関数(オリジナル関数)部分その2

  //--- common_flagの値に基づいてフォルダのフルパスを決定
  if (common_flag)
     // 共有フォルダの場合は、全端末で共有されるパスを使用
     working_folder = TerminalInfoString(TERMINAL_COMMONDATA_PATH) + "\\MQL5\\Files";
  else
     // ローカルフォルダの場合は、ローカルのパスを使用
     working_folder = TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Files";

  //--- デバッグ用メッセージ: 作成しようとしているフォルダのパスを表示
  PrintFormat("folder_path=%s", folder_path);

この部分では、CreateFolder関数の中で、フォルダのフルパスを決定し、デバッグメッセージを表示する処理が行われています。common_flagの値に基づいて、フォルダが作成される場所を決定し、その後デバッグ情報としてフォルダのパスを表示します。

フォルダのフルパスの決定

common_flagの値に応じて、フォルダが作成される場所を分岐しています。

  • common_flagがtrueの場合、全ての端末で共有されるフォルダにフォルダを作成します。具体的には、TerminalInfoString関数を使用してTERMINAL_COMMONDATA_PATHのパス(共有フォルダのパス)を取得し、その下のMQL5\Filesディレクトリにフォルダを作成します。
  • common_flagがfalseの場合は、ローカルの端末上にフォルダを作成します。この場合、TerminalInfoString関数TERMINAL_DATA_PATH(ローカルフォルダのパス)を取得し、MQL5\Filesディレクトリにフォルダを作成します。

デバッグ用メッセージの表示

PrintFormat関数を使用して、実際に作成しようとしているフォルダのパスをデバッグ用に表示しています。folder_path変数を利用し、作成対象のフォルダ名やパスをコンソールに出力します。これにより、フォルダの作成処理が正しいパスで行われているかどうかを確認することができます。

このように、common_flagの値に基づいてフォルダの作成場所を決定し、その後のフォルダ作成処理に進むための準備を行っています。

サンプルコード解説6:CreateFolder関数(オリジナル関数)部分その3

  //--- MQL5\Filesパスを基準にフォルダを作成し、成功したかどうかを確認
  if (FolderCreate(folder_path, flag))
    {
    //--- 作成したフォルダのフルパスを表示
    PrintFormat("Created the folder %s", working_folder + "\\" + folder_path);
    
    //--- エラーコードをリセット(正常に作成できた場合)
    ResetLastError();
    
    //--- フォルダ作成が成功した場合はtrueを返す
    return true;
    }

この部分では、フォルダ作成を試み、結果に応じた処理を行っています。MQL5\Filesディレクトリを基準に、指定されたフォルダを作成し、作成が成功したかどうかを判定しています。成功した場合にはフォルダパスを表示し、エラー処理をリセットして、結果を返す処理が行われます。

フォルダ作成の実行

FolderCreate関数を呼び出して、指定したフォルダパスに基づいてフォルダ作成を試みます。flag変数にはcommon_flagの値に基づいて、ローカルフォルダか共有フォルダかを判断するフラグが設定されています。FolderCreate関数が正常にフォルダを作成できた場合にtrueが返され、処理が続行されます。

フォルダ作成成功時の処理

フォルダが正しく作成された場合、PrintFormat関数を使って作成されたフォルダのフルパスを表示します。working_folderにはローカルまたは共有のベースパスが格納されており、folder_pathで指定されたフォルダ名と組み合わせて完全なパスを表示しています。これにより、フォルダがどのディレクトリに作成されたのかを確認することができます。

エラーコードのリセット

フォルダが正常に作成された後、ResetLastError関数を使用して、エラーコードをリセットします。これは、以前の処理でエラーが発生していた場合でも、現在の操作が成功したことを示すためです。

フォルダ作成が成功した場合の戻り値

最後に、フォルダ作成が成功した場合、trueを返して処理を終了します。これにより、呼び出し元に対してフォルダ作成が成功したことを通知します。

サンプルコード解説7:CreateFolder関数(オリジナル関数)部分その4

else
    //--- フォルダ作成に失敗した場合、エラーメッセージとエラーコードを表示
    PrintFormat("Failed to create the folder %s. Error code %d", working_folder + folder_path, GetLastError());

  //--- フォルダ作成が失敗した場合はfalseを返す
  return false;
 }

この部分では、フォルダ作成が失敗した場合の処理を行っています。フォルダ作成に失敗した際のエラーメッセージとエラーコードの表示、および関数の戻り値としてfalseを返す処理が行われます。

フォルダ作成失敗時の処理

もしFolderCreate関数がフォルダを正しく作成できなかった場合、elseのブロックが実行されます。この際、PrintFormat関数を使用して、フォルダの作成に失敗したことを示すエラーメッセージとともに、エラーコードを表示します。working_folderにフォルダのベースパスが格納されており、folder_pathで指定されたフォルダ名と組み合わせたパスが表示されます。

GetLastError関数を使用して、直前に発生したエラーコードを取得します。このエラーコードは、フォルダ作成が失敗した原因を調査する際に役立ちます。

フォルダ作成失敗時の戻り値

フォルダ作成が失敗した場合、CreateFolder関数はfalseを返して処理を終了します。これにより、呼び出し元に対してフォルダ作成が失敗したことを通知し、エラーハンドリングを行うための準備が整います。

このように、成功時にはtrue、失敗時にはfalseを返すことで、フォルダ作成処理の結果を明確に伝える仕組みが構築されています。

タイトルとURLをコピーしました