Un dossier n'est pas supprimé s'il contient des fichiers non fermés.

 
 

Pourquoi la fonction FolderClean() de ce script échoue-t-elle ?

//+------------------------------------------------------------------+ 
//|                                            Demo_FolderDelete.mq5 | 
//|                        Copyright 2011, MetaQuotes Software Corp. | 
//|                                              https://www.mql5.com | 
//+------------------------------------------------------------------+ 
#property copyright "Copyright 2011, MetaQuotes Software Corp." 
#property link      "https://www.mql5.com" 
#property version   "1.00" 
//--- описание 
#property description "Скрипт показывает пример использования FolderDelete()." 
#property description "Сначала создаются две папки, одна пустая, другая содержит файл." 
#property description "При попытке удаления непустой папки получим ошибку и предупреждение."
 
//--- покажем окно входных параметров при запуске скрипта 
#property script_show_inputs 
//--- входные параметры 
input string   firstFolder="empty";    // пустая папка 
input string   secondFolder="nonempty";// папка, в которой будет один файл 
string filename="delete_me.txt";       // имя файла, который мы создадим в папке secondFolder 
//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart() 
  { 
//--- хендл файла запишем сюда 
   int handle; 
//--- выясним в какой папке мы работаем 
   string working_folder=TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL4\\Files"; 
//--- отладочное сообщение    
   PrintFormat("working_folder=%s",working_folder); 
//--- попытка создать пустую папку относительно пути MQL4\Files 
   if(FolderCreate(firstFolder,0)) // 0 означает, что работаем в локальной папке терминала 
     { 
      //--- выведем полный путь до созданной папки 
      PrintFormat("Cоздали папку %s",working_folder+"\\"+firstFolder); 
      //--- сбросим код ошибки 
      ResetLastError(); 
     } 
   else 
      PrintFormat("Не удалось создать папку %s. Код ошибки %d",working_folder+"\\"+firstFolder, GetLastError());
 
//--- теперь создадим непустую папку с помощью функции FileOpen() 
   string filepath=secondFolder+"\\"+filename;  // сформируем путь для файла, который хотим открыть на запись в несуществующей папке 
   handle=FileOpen(filepath,FILE_WRITE|FILE_TXT); // флаг FILE_WRITE в данном случае обязателен, см. справку к функции FileOpen 
   if(handle!=INVALID_HANDLE) 
      PrintFormat("Открыли файл на чтение %s",working_folder+"\\"+filepath); 
   else 
      PrintFormat("Не удалось создать файл %s в папке %s. Код ошибки=",filename,secondFolder, GetLastError());
 
   Comment(StringFormat("Готовимся удалить папки %s и %s", firstFolder, secondFolder)); 
//--- Небольшая пауза в 5 секунд, чтобы мы могли прочитать сообщение на графике 
   Sleep(5000); // Sleep() нельзя использовать в индикаторах!
 
//--- выведем диалоговое окно и просим пользователя 
   int choice=MessageBox(StringFormat("Удалить папки %s и %s?", firstFolder, secondFolder), 
                         "Удаление папок", 
                         MB_YESNO|MB_ICONQUESTION); //  будут две кнопки - "Yes" и "No"
 
//--- выполним действия в зависимости от выбранного варианта 
   if(choice==IDYES) 
     { 
      //--- очистим комментарий на графике 
      Comment(""); 
      //--- выведем сообщение в журнал "Эксперты" 
      PrintFormat("Пробуем удалить папки %s и %s",firstFolder, secondFolder); 
      ResetLastError(); 
      //--- удаляем пустую папку 
      if(FolderDelete(firstFolder)) 
         //--- должны увидеть это сообщение, так как папка пустая 
         PrintFormat("Папка %s успешно удалена",firstFolder); 
      else 
         PrintFormat("Не удалось удалить папку %s. Код ошибки=%d", firstFolder, GetLastError());
 
      ResetLastError(); 

   //***********************************************************************************************************************   
      //--- сначала очищаем папку
      if(FolderClean(secondFolder))
         PrintFormat("Папка %s успешно очищена", secondFolder);
      else 
         //---  
         PrintFormat("Не удалось очистить папку %s. Код ошибки=%d", secondFolder, GetLastError());
   //***********************************************************************************************************************   
   
      ResetLastError(); 
        
      //--- удаляем папку, которая содержит файл               
      if(FolderDelete(secondFolder)) 
         PrintFormat("Папка %s успешно удалена", secondFolder); 
      else 
         //--- 
         PrintFormat("Не удалось удалить папку %s. Код ошибки=%d", secondFolder, GetLastError()); 
     }  

   else 
      Print("Удаление отменено"); 
//--- 
  }

Une tentative de nettoyage d'un dossier entraîne l'erreur 5026 - (le dossier ne peut pas être nettoyé).

Ce script est tiré de la documentation (section de FolderDelete()) et légèrement modifié. Un dossier qui contient d'autres sous-dossiers ou fichiers doit être effacé pour être complètement supprimé. Un appel à FolderClean() est ajouté à cet effet.

 
Реter Konow:

Pourquoi la fonction FolderClean() de ce script échoue-t-elle ?

Une tentative d'effacement d'un dossier entraîne l'erreur 5026 - (le dossier ne peut être effacé).

Ce script est tiré de la documentation (section de la fonction FolderDelete()) et légèrement modifié. Pour supprimer complètement un dossier qui contient d'autres sous-dossiers ou fichiers, vous devez le vider. Un appel à FolderClean() est ajouté à cet effet.


Cela ne vous gêne-t-il pas d'essayer d'entrer dans le bac à sable de quelqu'un d'autre (dans MQL4) ?

 
Vladimir Karputov:

N'est-il pas déroutant que vous essayiez de pénétrer dans le bac à sable de quelqu'un d'autre (dans MQL4) ?

Je ne vous comprends pas bien. Qu'est-ce que tu veux dire ? J'ai réalisé mon expérience sur MT4.
 
Реter Konow:
Je ne vous comprends pas bien. Qu'est-ce que vous voulez dire par là. L'expérience a été réalisée sur MT4.

FileOpen:

Note

Pour des raisons de sécurité, le langage MQL5 contrôle strictement les opérations avec les fichiers. Les fichiers qui sont traités à l'aide du langage MQL5 ne peuvent pas se trouver en dehors du "bac à sable" des fichiers.

Un fichier est ouvert dans le dossier du terminal du client dans le sous-dossier MQL5\Files (ou dans le répertoire_agent_testing_directory\MQL5\Files en cas de test). Si FILE_COMMON est spécifié parmi les indicateurs, le fichier sera ouvert dans le dossier commun de tous les terminaux clients : \Terminal\Common\Files.

Quel est le rapport avec l'ancien terminal, si vous exécutez du code MQL5 ?
 
Vladimir Karputov:

FileOpen:

Note

Pour des raisons de sécurité, le langage MQL5 contrôle strictement les opérations avec les fichiers. Les fichiers qui sont traités à l'aide du langage MQL5 ne peuvent pas se trouver en dehors du "bac à sable" des fichiers.

Un fichier est ouvert dans le dossier du terminal du client dans le sous-dossier MQL5\Files (ou dans le répertoire_agent_testing_directory\MQL5\Files en cas de test). Si FILE_COMMON est spécifié parmi les indicateurs, le fichier est ouvert dans le dossier commun de tous les terminaux clients : \Terminal\Common\Files.

Ce script est tiré de la documentation.

Voici la piste dans laquelle les dossiers sont créés :

string working_folder=TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL4\\Files"; 

Une partie de la fonction FolderDelete() fonctionne et efface le dossier qui est vide. Cependant, la fonction FolderDelete() ne fonctionnera plus sur un dossier contenant un fichier car il y a un fichier à l'intérieur du dossier qui doit d'abord être effacé. Pour l'effacer, j'ai ajouté un appel à FolderClean() comme indiqué dans les instructions. Cependant, la fonction FolderClean() échoue pour une raison quelconque et le dossier contenant le fichier n'est pas effacé. Par conséquent, il n'est pas effacé par FolderDelete().

 
Vladimir Karputov:

FileOpen:

Note

Pour des raisons de sécurité, le langage MQL5 contrôle strictement les opérations avec les fichiers. Les fichiers qui sont traités à l'aide du langage MQL5 ne peuvent pas se trouver en dehors du "bac à sable" des fichiers.

Un fichier est ouvert dans le dossier du terminal du client dans le sous-dossier MQL5\Files (ou dans le répertoire_agent_testing_directory\MQL5\Files en cas de test). Si FILE_COMMON est spécifié parmi les indicateurs, le fichier s'ouvre dans le dossier commun de tous les terminaux clients : \Terminal\Common\Files.

Qu'est-ce que cela a à voir avec l'ancien terminal si vous exécutez le code MQL5 ?
Il n'y a pas de différence entre le MQL4 et le MQL5. Le code de ce script fonctionne également sur les deux plateformes. Je l'ai testé sur MT4.
 
Реter Konow:
Il n'y a pas de différence si le code est MQL4 ou MQL5. Le code de ce script fonctionne également sur les deux plateformes. Je l'ai testé sur MT4.

Avez-vous exécuté le code MQL5 dans l'ancien terminal ? Laissez-moi vérifier...

 
Vladimir Karputov:

Avez-vous exécuté le code MQL5 dans l'ancien terminal ? Laissez-moi vérifier...

Croyez-moi, il n'y a aucun problème avec ça.
 
Реter Konow:
Croyez-moi, il n'y a aucun problème avec ça.

Ce que je devais prouver : le vieux terminal ne voit pas les programmes MQL5. Vous essayez d'ouvrir le sandbox d'un autre fichier dans un script MQL5.

 

Реter Konow:

Cependant, la fonction FolderClean() échoue pour une raison quelconque et le dossier contenant le fichier n'est pas effacé. Par conséquent, il n'est pas effacé par FolderDelete().

Pour une raison quelconque, le système d'exploitation ne me laisse pas supprimer le fichier - il est peut-être ouvert par un autre programme ou il n'a pas les droits d'accès.

PS En général, ne pas donner les logs du programme revient à forcer les autres à deviner par le marc de café.