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.
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) ?
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 vous voulez dire par là. L'expérience a été réalisée sur MT4.
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.
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().
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.
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...
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.
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.
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation