【MQL5】FolderDelete関数について

MQL5リファレンス
スポンサーリンク
スポンサーリンク
  1. FolderDelete関数の働き・役割
  2. FolderDelete関数の引数について
    1. 第一引数: folder_name
    2. 第二引数: common_flag
  3. FolderDelete関数の戻り値について
  4. FolderDelete関数を使ったサンプルコード
  5. サンプルコード解説1:グローバル領域部分
    1. 1. #property script_show_inputs
    2. 2. firstFolderの定義
    3. 3. secondFolderの定義
    4. 4. filenameの定義
  6. サンプルコード解説2:OnStart関数部分その1
    1. 1. handleの定義
    2. 2. working_folderの取得
    3. 3. デバッグメッセージの表示
  7. サンプルコード解説3:OnStart関数部分その2
    1. 1. FolderCreate関数の使用
    2. 2. フォルダ作成成功時の処理
    3. 3. フォルダ作成失敗時の処理
  8. サンプルコード解説4:OnStart関数部分その3
    1. 1. ファイルパスの生成
    2. 2. FileOpen関数の使用
    3. 3. ファイル作成成功時の処理
    4. 4. ファイル作成失敗時の処理
  9. サンプルコード解説5:OnStart関数部分その4
    1. 1. 削除準備のメッセージ表示
    2. 2. 休止処理(Sleep関数)
    3. 3. 削除確認ダイアログの表示
  10. サンプルコード解説6:OnStart関数部分その5
    1. 1. ダイアログ結果に応じた分岐
    2. 2. チャート上のコメントを削除
    3. 3. 削除開始メッセージの表示
    4. 4. エラーコードのリセット
    5. 5. firstFolderの削除処理
    6. 6. 削除失敗時の処理
  11. サンプルコード解説7:OnStart関数部分その6
    1. 1. エラーコードのリセット
    2. 2. secondFolderの削除処理
    3. 3. 削除失敗時の処理
  12. サンプルコード解説8:OnStart関数部分その7
    1. 1. 「いいえ」を選択した場合の分岐処理
    2. 2. 削除キャンセルのメッセージ表示
    3. 3. スクリプトの終了

FolderDelete関数の働き・役割

FolderDelete関数は、指定されたフォルダ(ディレクトリ)を削除するための関数です。指定されたディレクトリが空である場合のみ削除が可能で、もしそのディレクトリ内にファイルやサブディレクトリが存在している場合は削除できません。そのため、削除する前にフォルダ内の全てのファイルやサブディレクトリを削除する必要があります。FolderDelete関数は、ローカル端末や共有フォルダにあるディレクトリを削除する際に使用されます。

一般的に、フォルダ内のファイルやサブディレクトリを全て削除するには、まずFolderClean関数を使ってフォルダをクリーンアップするのが推奨されます。その後、FolderDelete関数を実行することで、フォルダそのものを安全に削除することができます。

FolderDelete関数の引数について

FolderDelete関数には2つの引数があります。

第一引数: folder_name

folder_nameは、削除するディレクトリの名前を指定するための引数です。この引数では、削除対象となるフォルダの絶対パスを指定します。絶対パスとは、フォルダの場所を完全に特定するためのパスで、OSのディレクトリ構造に従ってフルパス形式で記述されます。

第二引数: common_flag

common_flagは、削除するディレクトリの場所を指定するフラグです。初期値は0に設定されています。

  • common_flagに0を指定した場合、そのディレクトリはローカル端末のフォルダに存在します。通常はMQL5の「Files」フォルダ内に位置します。もしテスト中であれば、「Tester\Files」フォルダに位置します。
  • common_flagにFILE_COMMONを指定した場合、そのディレクトリは全てのクライアント端末間で共有されるフォルダ、\Terminal\Common\Files に存在します。このオプションは複数の端末で同じファイルにアクセスしたい場合に使用します。

FolderDelete関数の戻り値について

FolderDelete関数戻り値は、処理の成功または失敗を示します。

  • 関数が正常にフォルダを削除できた場合、true が返されます。
  • フォルダが空でなかったり、指定されたディレクトリが見つからないなどの理由で削除ができなかった場合は、false が返されます。

この戻り値を利用して、削除の成功・失敗を確認し、適切なエラーハンドリングを行うことが可能です。

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

//--- スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs

//--- 入力パラメータを定義
input string   firstFolder="empty";   // 最初のフォルダ名(空のフォルダを作成する)
input string   secondFolder="nonempty";// 2番目のフォルダ名(このフォルダにはファイルを作成する)
string filename="delete_me.txt";       // secondFolderに作成されるファイルの名前

//+------------------------------------------------------------------+
//| スクリプトプログラムを開始する関数                                 |
//+------------------------------------------------------------------+
void OnStart()
{
  //--- ファイル操作に必要なハンドルを定義
  int handle;
  
  //--- 作業を行うフォルダのパスを取得
  // TerminalInfoString関数を使い、端末データパスに含まれる"MQL5\Files"ディレクトリを指定
  string working_folder = TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Files";
  
  //--- 取得したフォルダパスをデバッグメッセージとしてエキスパートログに表示
  PrintFormat("working_folder=%s", working_folder);
  
  //--- MQL5\Filesに対してfirstFolderを作成し、フォルダが正常に作成されたか確認する
  // FolderCreate関数でフォルダを作成、0はローカルフォルダでの作業を意味する
  if(FolderCreate(firstFolder, 0)) 
  {
    //--- フォルダの作成が成功した場合、作成されたフォルダの絶対パスをエキスパートログに表示
    PrintFormat("Folder %s has been created", working_folder + "\\" + firstFolder);
    
    //--- エラーコードをリセットする
    ResetLastError();
  }
  else
  {
    //--- フォルダ作成に失敗した場合、エラーコードを表示
    PrintFormat("Failed to create folder %s. Error code %d", working_folder + "\\" + firstFolder, GetLastError());
  }

  //--- secondFolder内にfilenameというファイルを作成
  // フォルダパスを作成し、そのフォルダ内にファイルを作成するパスを指定
  string filepath = secondFolder + "\\" + filename;
  
  //--- FileOpen関数を使ってファイルを書き込み用に開く
  // この関数でフォルダも自動的に作成される
  handle = FileOpen(filepath, FILE_WRITE | FILE_TXT); // FILE_WRITEはファイル書き込み権限を意味する
  
  if(handle != INVALID_HANDLE)
  {
    //--- ファイルの作成が成功した場合、エキスパートログに成功メッセージを表示
    PrintFormat("File %s has been opened for writing", working_folder + "\\" + filepath);
  }
  else
  {
    //--- ファイル作成に失敗した場合、エラーコードを表示
    PrintFormat("Failed to create file %s in folder %s. Error code=%d", filename, secondFolder, GetLastError());
  }

  //--- 削除準備のメッセージを表示
  Comment(StringFormat("Prepare to delete folders %s and %s", firstFolder, secondFolder));
  
  //--- チャートメッセージを表示させるために5秒間の休止
  Sleep(5000); // インジケータではSleep関数は使えないため注意
  
  //--- ダイアログを表示して、ユーザーにフォルダ削除の確認を求める
  int choice = MessageBox(StringFormat("Do you want to delete folders %s and %s?", firstFolder, secondFolder),
                          "Deleting folders",
                          MB_YESNO | MB_ICONQUESTION); // 「はい」と「いいえ」の選択肢を提供するダイアログ
  
  //--- ダイアログの結果に応じて処理を分岐
  if(choice == IDYES)
  {
    //--- ユーザーが「はい」を選択した場合の処理
    // チャート上のコメントを削除
    Comment("");
    
    //--- 削除処理を開始するメッセージをエキスパートログに表示
    PrintFormat("Trying to delete folders %s and %s", firstFolder, secondFolder);
    
    //--- エラーコードをリセット
    ResetLastError();
    
    //--- firstFolder(空のフォルダ)を削除
    if(FolderDelete(firstFolder))
    {
      //--- フォルダが空であり、削除成功時のメッセージを表示
      PrintFormat("Folder %s has been successfully deleted", firstFolder);
    }
    else
    {
      //--- フォルダ削除に失敗した場合、エラーコードを表示
      PrintFormat("Failed to delete folder %s. Error code=%d", firstFolder, GetLastError());
    }

    //--- エラーコードをリセット
    ResetLastError();
    
    //--- secondFolder(ファイルが存在するフォルダ)を削除
    if(FolderDelete(secondFolder))
    {
      //--- フォルダ削除成功時のメッセージを表示
      PrintFormat("Folder %s has been successfully deleted", secondFolder);
    }
    else
    {
      //--- フォルダにファイルが残っているため削除に失敗し、エラーコードを表示
      PrintFormat("Failed to delete folder %s. Error code=%d", secondFolder, GetLastError());
    }
  }
  else
  {
    //--- ユーザーが「いいえ」を選択した場合、削除処理をキャンセルするメッセージを表示
    Print("Deletion canceled");
  }
//--- スクリプト終了
}

このプログラムは、指定された2つのフォルダ(1つは空、もう1つはファイルが含まれているフォルダ)を作成し、その後、ユーザーにこれらのフォルダを削除するかどうかの確認を行うスクリプトです。ユーザーが削除を承認した場合、空のフォルダは削除されますが、ファイルが含まれるフォルダの削除は失敗します。ユーザーが削除をキャンセルした場合、削除処理は実行されず、ログにキャンセルされた旨が記録されます。

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

//--- スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs

//--- 入力パラメータを定義
input string   firstFolder="empty";   // 最初のフォルダ名(空のフォルダを作成する)
input string   secondFolder="nonempty";// 2番目のフォルダ名(このフォルダにはファイルを作成する)
string filename="delete_me.txt";       // secondFolderに作成されるファイルの名前

このセクションでは、スクリプトのグローバル領域に定義された要素について解説します。グローバル領域とは、スクリプト全体で使用される変数や設定などが記述される部分であり、他の関数やコードのブロックからアクセス可能です。

1. #property script_show_inputs

この行は、スクリプトが実行される際に、入力パラメータの設定ウィンドウを自動的に表示するための設定です。このウィンドウでは、ユーザーがスクリプトの動作に必要なパラメータを入力・変更できるようになります。

2. firstFolderの定義

この部分では、スクリプトが作成する最初のフォルダ名を指定するための入力パラメータ firstFolder が定義されています。この変数は「空のフォルダ」を作成する目的で使用され、初期値として “empty” というフォルダ名が設定されています。

inputキーワードは、ユーザーがスクリプトの実行時にこの値を変更できることを意味します。たとえば、フォルダ名を “myFolder” に変更して実行することが可能です。

3. secondFolderの定義

この部分では、2番目のフォルダ名を指定するための入力パラメータ secondFolder が定義されています。このフォルダには後にファイルが作成される予定で、初期値として “nonempty” という名前が指定されています。

この変数も、inputキーワードによってユーザーが実行時に変更できるようになっています。ユーザーはこの値を変更して、任意のフォルダ名を設定することができます。

4. filenameの定義

この部分では、2番目のフォルダ(secondFolder)内に作成されるファイルの名前が指定されています。この変数は入力パラメータではなく、単なるローカル変数として定義されているため、スクリプトの中で変更可能です。ただし、ユーザーはこの値を直接変更することはできません。

ファイル名としては “delete_me.txt” が指定されていますが、これは後に削除を試みるファイルです。この名前は、フォルダ内にファイルがある場合に、フォルダの削除が失敗する状況を確認するために使用されます。


このグローバル領域では、スクリプトがどのフォルダを作成し、どのファイルを操作するのかを指定するための重要な変数が定義されています。

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

//+------------------------------------------------------------------+
//| スクリプトプログラムを開始する関数                                 |
//+------------------------------------------------------------------+
void OnStart()
{
  //--- ファイル操作に必要なハンドルを定義
  int handle;
  
  //--- 作業を行うフォルダのパスを取得
  // TerminalInfoString関数を使い、端末データパスに含まれる"MQL5\Files"ディレクトリを指定
  string working_folder = TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Files";
  
  //--- 取得したフォルダパスをデバッグメッセージとしてエキスパートログに表示
  PrintFormat("working_folder=%s", working_folder);

このセクションでは、スクリプトのメイン部分であるOnStart関数の最初の部分について解説します。OnStart関数は、スクリプトが実行された際に最初に呼び出される関数であり、MQL5スクリプトプログラムでは重要な役割を果たします。

1. handleの定義

この部分では、ファイル操作に必要なハンドルを格納するための変数handleを定義しています。ハンドルは、ファイルやリソースに対するアクセスを管理するために使用される識別子です。後にファイル操作を行う際に、このハンドルが使用されます。

2. working_folderの取得

この部分では、スクリプトが操作を行う作業ディレクトリのパスを取得しています。TerminalInfoString関数を使用して、現在の端末のデータパスにある「MQL5\Files」フォルダを取得します。これは、MQL5スクリプトが操作できる領域内にあるフォルダで、セキュリティ上の理由からMQL5ではこのファイルサンドボックス内のみでのファイル操作が許可されています。

具体的には、TerminalInfoString関数が端末のデータディレクトリを返し、MQL5\Filesというサブフォルダが指定されることで、スクリプトがこのフォルダ内で操作を行う準備が整います。

3. デバッグメッセージの表示

この部分では、取得した作業フォルダのパスをデバッグ目的でエキスパートログに出力しています。PrintFormat関数を使用し、フォーマット指定された文字列をログに出力することで、プログラムが期待通りのディレクトリを取得できているかを確認することができます。

このように、最初に作業ディレクトリのパスを取得し、それをログに出力することで、後続のファイル操作が適切な場所で行われるようにしています。

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

  if(FolderCreate(firstFolder, 0)) 
  {
    //--- フォルダの作成が成功した場合、作成されたフォルダの絶対パスをエキスパートログに表示
    PrintFormat("Folder %s has been created", working_folder + "\\" + firstFolder);
    
    //--- エラーコードをリセットする
    ResetLastError();
  }
  else
  {
    //--- フォルダ作成に失敗した場合、エラーコードを表示
    PrintFormat("Failed to create folder %s. Error code %d", working_folder + "\\" + firstFolder, GetLastError());
  }

このセクションでは、OnStart関数内でフォルダの作成処理が行われている部分について解説します。この部分では、最初に指定したフォルダの作成を試み、成功・失敗に応じて適切なメッセージをエキスパートログに出力します。

1. FolderCreate関数の使用

この部分では、FolderCreate関数を使用して、firstFolderという名前のフォルダを作成します。第2引数に0を指定することで、ローカルの端末フォルダ(通常はMQL5\Filesフォルダ)内にフォルダが作成されます。

もし、FolderCreate関数がtrue(フォルダの作成に成功)を返した場合、処理がif文の中で実行されます。false(失敗)が返された場合は、elseの処理が実行されます。

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

フォルダの作成に成功した場合、PrintFormat関数を使ってエキスパートログにメッセージを表示します。このメッセージでは、作成されたフォルダの絶対パスが表示され、正しくフォルダが作成されたことを確認できます。

また、フォルダ作成後にResetLastError関数が呼ばれています。これは、エラーステータスをリセットし、次の処理で誤ったエラー情報を参照しないようにするためです。

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

フォルダの作成が失敗した場合、elseブロック内の処理が実行されます。この場合もPrintFormat関数が使用され、作成に失敗したフォルダのパスとエラーコードがエキスパートログに出力されます。

エラーコードはGetLastError関数で取得されます。このエラーコードを参照することで、なぜフォルダ作成が失敗したのかを特定することができます。エラーメッセージにより、ディレクトリの書き込み権限がない場合やフォルダ名が不正である場合など、具体的な原因を確認することが可能です。


この部分では、フォルダの作成を行い、その成功や失敗をログに記録する処理が実装されています。これにより、スクリプトが期待通りに動作しているかを確認することができます。

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

  //--- secondFolder内にfilenameというファイルを作成
  // フォルダパスを作成し、そのフォルダ内にファイルを作成するパスを指定
  string filepath = secondFolder + "\\" + filename;
  
  //--- FileOpen関数を使ってファイルを書き込み用に開く
  // この関数でフォルダも自動的に作成される
  handle = FileOpen(filepath, FILE_WRITE | FILE_TXT); // FILE_WRITEはファイル書き込み権限を意味する
  
  if(handle != INVALID_HANDLE)
  {
    //--- ファイルの作成が成功した場合、エキスパートログに成功メッセージを表示
    PrintFormat("File %s has been opened for writing", working_folder + "\\" + filepath);
  }
  else
  {
    //--- ファイル作成に失敗した場合、エラーコードを表示
    PrintFormat("Failed to create file %s in folder %s. Error code=%d", filename, secondFolder, GetLastError());
  }

このセクションでは、secondFolder内にファイルを作成する処理について解説します。この部分では、ファイルの作成と、その成否に応じたログメッセージの出力が行われます。

1. ファイルパスの生成

最初に、作成するファイルのパスを指定しています。secondFolder変数に指定されたフォルダの中に、filename変数で指定されたファイル名(この場合は “delete_me.txt”)を持つファイルを作成するため、フォルダ名とファイル名を組み合わせて完全なファイルパスを生成します。

このファイルパスは、ファイルを操作する際に必要となる絶対パスとして使われます。

2. FileOpen関数の使用

次に、FileOpen関数を使用して指定したファイルを開きます。この関数では、ファイルが存在しない場合は新規作成され、存在する場合は開かれて書き込み用に使用されます。FILE_WRITEフラグはファイルの書き込み権限を意味し、FILE_TXTフラグはテキストファイルとして開くことを指定しています。

また、FileOpen関数はフォルダが存在しない場合、自動的にフォルダを作成します。そのため、ファイルを作成するフォルダ自体も存在していない場合でも、フォルダの生成が行われます。

3. ファイル作成成功時の処理

ファイルが正常に作成された場合、handleには有効なハンドルが返されます。このハンドルINVALID_HANDLEではないことを確認した後、PrintFormat関数を使用して、ファイルが正常に作成されたことをエキスパートログに出力します。このログには、作成されたファイルのパスが含まれ、ファイル操作が成功したことを確認できます。

4. ファイル作成失敗時の処理

ファイル作成が失敗した場合、FileOpen関数INVALID_HANDLEを返します。この場合、elseブロックが実行され、エラーメッセージがエキスパートログに表示されます。PrintFormat関数を使って、作成に失敗したファイルのパスと、エラーコードがログに出力されます。

エラーコードはGetLastError関数で取得され、具体的なエラーの原因を調べることが可能です。たとえば、ファイル書き込み権限がない場合やディスク容量が不足している場合など、さまざまなエラー状況が考えられます。


この部分では、secondFolder内にファイルを作成し、その成否をログに出力する処理が実装されています。これにより、ファイルの生成や書き込みが正常に行われているかどうかを確認することができます。

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

  //--- 削除準備のメッセージを表示
  Comment(StringFormat("Prepare to delete folders %s and %s", firstFolder, secondFolder));
  
  //--- チャートメッセージを表示させるために5秒間の休止
  Sleep(5000); // インジケータではSleep関数は使えないため注意
  
  //--- ダイアログを表示して、ユーザーにフォルダ削除の確認を求める
  int choice = MessageBox(StringFormat("Do you want to delete folders %s and %s?", firstFolder, secondFolder),
                          "Deleting folders",
                          MB_YESNO | MB_ICONQUESTION); // 「はい」と「いいえ」の選択肢を提供するダイアログ

このセクションでは、フォルダ削除の準備および、ユーザーから削除の確認を求める処理について解説します。この部分では、ユーザーに対してメッセージを表示し、削除するかどうかの選択を行わせるロジックが含まれています。

1. 削除準備のメッセージ表示

最初に、削除準備のメッセージをチャート上に表示する処理が行われています。Comment関数を使用して、チャートウィンドウに「firstFolder」と「secondFolder」を削除する準備ができた旨のメッセージを表示します。このメッセージは、ユーザーに対して削除操作が始まる前に状況を伝えるためのものです。

StringFormat関数を使うことで、複数のフォルダ名を動的に組み合わせて1つのメッセージにしています。

2. 休止処理(Sleep関数)

次に、Sleep関数を使用してスクリプトを5秒間一時停止させています。この5秒間の休止は、チャート上のメッセージを表示するための時間を確保するためです。Sleep関数は、指定したミリ秒数だけプログラムの実行を停止する機能を持ち、この例では5000ミリ秒(5秒)となっています。

ただし、Sleep関数インジケータでは使用できないため、インジケータ内でこの関数を使用する場合は注意が必要です。

3. 削除確認ダイアログの表示

次に、ユーザーに対してフォルダを削除するかどうかを確認するためのダイアログを表示します。この部分では、MessageBox関数を使い、ダイアログボックスを表示します。このダイアログでは、「はい」と「いいえ」の選択肢があり、ユーザーがどちらかを選択します。

StringFormat関数で、削除対象のフォルダ名を含むメッセージを作成し、ダイアログのメッセージとして表示します。また、ダイアログのタイトルは「Deleting folders」とし、ダイアログのタイプとしてアイコン付きの質問ダイアログが指定されています。

このダイアログを使用することで、ユーザーの明確な指示を得てから削除処理を行うようにしているため、安全に操作を進めることができます。


この部分では、フォルダ削除前の準備として、ユーザーに対して削除の意思確認を行う処理が実装されています。これにより、ユーザーは意図しないフォルダ削除を防ぐことができ、操作がより安全になります。

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

  //--- ダイアログの結果に応じて処理を分岐
  if(choice == IDYES)
  {
    //--- ユーザーが「はい」を選択した場合の処理
    // チャート上のコメントを削除
    Comment("");
    
    //--- 削除処理を開始するメッセージをエキスパートログに表示
    PrintFormat("Trying to delete folders %s and %s", firstFolder, secondFolder);
    
    //--- エラーコードをリセット
    ResetLastError();
    
    //--- firstFolder(空のフォルダ)を削除
    if(FolderDelete(firstFolder))
    {
      //--- フォルダが空であり、削除成功時のメッセージを表示
      PrintFormat("Folder %s has been successfully deleted", firstFolder);
    }
    else
    {
      //--- フォルダ削除に失敗した場合、エラーコードを表示
      PrintFormat("Failed to delete folder %s. Error code=%d", firstFolder, GetLastError());
    }

このセクションでは、ユーザーが「はい」を選択した場合のフォルダ削除処理について解説します。この部分では、選択結果に応じた処理が行われ、指定されたフォルダを削除するロジックが含まれています。

1. ダイアログ結果に応じた分岐

最初に、ユーザーがダイアログで「はい」を選択したかどうかを確認するために、条件分岐が行われています。choice変数の値がIDYES(ユーザーが「はい」を選択)であれば、フォルダ削除処理が続行されます。

2. チャート上のコメントを削除

次に、Comment関数を使ってチャート上に表示されていたメッセージを削除します。これにより、削除処理が開始されたことを示すコメントが消去されます。

3. 削除開始メッセージの表示

フォルダ削除処理を開始する前に、PrintFormat関数を使って削除対象のフォルダ名をエキスパートログに表示します。これにより、削除処理が開始されたことを記録し、後で削除対象を確認できるようになります。

4. エラーコードのリセット

次に、ResetLastError関数を使用してエラーコードをリセットします。これにより、前の処理で発生したエラーが残らないようにし、次に発生する可能性のあるエラーを正確に捕捉できるようにします。

5. firstFolderの削除処理

次に、FolderDelete関数を使って、firstFolder(空のフォルダ)の削除を試みます。FolderDelete関数がtrueを返した場合、フォルダ削除が成功したことを意味し、成功メッセージがログに出力されます。フォルダの削除が完了すると、PrintFormat関数によって削除成功メッセージが表示されます。

6. 削除失敗時の処理

もしFolderDelete関数がfalseを返した場合、フォルダ削除が失敗したことを意味します。この場合、GetLastError関数で取得したエラーコードをPrintFormat関数を使ってログに出力します。これにより、フォルダ削除が失敗した原因を確認し、必要に応じて対策を取ることができます。


この部分では、ユーザーが「はい」を選択した場合にフォルダ削除を実行し、その結果に応じてログメッセージを出力する処理が実装されています。これにより、削除処理の成功や失敗を確認でき、エラーハンドリングが可能です。

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

 //--- エラーコードをリセット
    ResetLastError();
    
    //--- secondFolder(ファイルが存在するフォルダ)を削除
    if(FolderDelete(secondFolder))
    {
      //--- フォルダ削除成功時のメッセージを表示
      PrintFormat("Folder %s has been successfully deleted", secondFolder);
    }
    else
    {
      //--- フォルダにファイルが残っているため削除に失敗し、エラーコードを表示
      PrintFormat("Failed to delete folder %s. Error code=%d", secondFolder, GetLastError());
    }
  }

このセクションでは、secondFolderの削除処理について解説します。この部分では、firstFolderとは異なり、ファイルが存在する可能性があるフォルダを削除するためのロジックが含まれています。

1. エラーコードのリセット

まず、ResetLastError関数を使ってエラーコードをリセットしています。これにより、前の処理で発生したエラーがリセットされ、次のフォルダ削除処理で新しいエラーが発生した場合に正確に検出できるようにします。

2. secondFolderの削除処理

次に、FolderDelete関数を使用してsecondFolderの削除を試みます。secondFolderにはファイルが存在する可能性があるため、フォルダが空でない場合には削除が失敗する可能性があります。FolderDelete関数がtrueを返した場合、フォルダが正常に削除されたことを意味します。

削除が成功した場合には、PrintFormat関数を使用して、削除成功メッセージをエキスパートログに表示します。このメッセージには、削除されたフォルダの名前が含まれます。

3. 削除失敗時の処理

もしFolderDelete関数がfalseを返した場合、フォルダ削除が失敗したことを意味します。特に、secondFolderにはファイルが残っている可能性が高いため、この失敗は予想される結果です。失敗時には、GetLastError関数を使ってエラーコードを取得し、そのエラーコードを含むメッセージをPrintFormat関数でログに出力します。

このエラーコードを参照することで、なぜフォルダの削除に失敗したのかを分析できます。たとえば、フォルダにファイルが残っている場合や、アクセス権の問題などが考えられます。


この部分では、secondFolder(ファイルが存在する可能性のあるフォルダ)の削除を試み、その結果に応じて成功または失敗のメッセージをログに出力する処理が実装されています。ファイルが存在するフォルダの削除に失敗する場合が多いため、エラーメッセージの出力により、ユーザーは問題を確認して対処することができます。

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

このセクションでは、ユーザーがフォルダ削除の確認ダイアログで「いいえ」を選択した場合の処理について解説します。この部分では、削除操作をキャンセルし、適切なメッセージをエキスパートログに出力します。

1. 「いいえ」を選択した場合の分岐処理

elseブロックでは、ユーザーがフォルダ削除の確認ダイアログで「いいえ」を選択した場合の処理が行われます。ユーザーが削除をキャンセルした場合には、フォルダの削除処理は一切行われません。

2. 削除キャンセルのメッセージ表示

Print関数を使用して、「Deletion canceled(削除処理がキャンセルされました)」というメッセージをエキスパートログに表示します。これにより、削除操作がキャンセルされたことを記録し、後で確認できるようにします。

この処理は、ユーザーが意図的にフォルダ削除をキャンセルしたことを示し、安全な操作が行われていることを確認するためのもので、誤ってフォルダを削除してしまうことを防ぎます。

3. スクリプトの終了

elseブロックが終わると、スクリプトは終了します。この時点で削除処理がキャンセルされたため、フォルダやファイルに対する変更は一切行われません。


この部分では、ユーザーが削除操作をキャンセルした場合に、それをエキスパートログに出力する処理が実装されています。これにより、削除が行われなかったことを記録でき、安全な操作が保証されます。

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