Why does the FolderClean() function in this script fail?
//+------------------------------------------------------------------+ //| 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("Удаление отменено"); //--- }
An attempt to clean a folder results in error 5026 - (folder cannot be cleaned).
This script is taken from the documentation (section of FolderDelete()) and slightly modified. A folder that contains other subfolders or files must be cleared to completely remove it. A call to FolderClean() is added for this purpose.
Why does the FolderClean() function in this script fail?
An attempt to clear a folder results in error 5026 - (folder cannot be cleared).
This script is taken from the documentation (section of the FolderDelete() function) and slightly modified. To completely delete a folder that contains other subfolders or files, you should clear it. A call to FolderClean() is added for this purpose.
Doesn't it bother you that you are trying to enter someone else's sandbox (in MQL4)?
Isn't it confusing that you're trying to get into someone else's sandbox (in MQL4)?
I don't quite understand you. What do you mean by that. The experiment was done on MT4.
Note
For security reasons, the MQL5 language strictly controls operations with files. The files that are handled using the MQL5 language cannot be outside the file "sandbox".
A file is opened in the client terminal folder in subfolder MQL5\Files (or in the_agent_testing_directory\MQL5\Files in case of testing). If FILE_COMMON is specified among the flags, the file will be opened in the common folder of all the client terminals \Terminal\Common\Files.
Note
For security reasons, the MQL5 language strictly controls operations with files. The files that are handled using the MQL5 language cannot be outside the file "sandbox".
A file is opened in the client terminal folder in subfolder MQL5\Files (or in the_agent_testing_directory\MQL5\Files in case of testing). If FILE_COMMON is specified among the flags, the file is opened in the common folder of all the client terminals \Terminal\Common\Files.
This script is taken from documentation.
Here is the track in which folders are created:
string working_folder=TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL4\\Files";
Part of the FolderDelete() function works and erases the folder that is empty. However, the FolderDelete() function will no longer work on a folder with a file because there is a file inside the folder that must first be erased. To erase it, I added a call to FolderClean() as per the instructions. However, the FolderClean() function fails for some reason and the folder with the file is not cleared. As a result, it is not erased by FolderDelete().
Note
For security reasons, the MQL5 language strictly controls operations with files. The files that are handled using the MQL5 language cannot be outside the file "sandbox".
A file is opened in the client terminal folder in subfolder MQL5\Files (or in the_agent_testing_directory\MQL5\Files in case of testing). If FILE_COMMON is specified among the flags, the file opens in the common folder of all the client terminals \Terminal\Common\Files.
Did you run the MQL5 code in the old terminal? Let me check ...
Believe me, there's no problem with that.
What I had to prove: old terminal DOES NOT SEE MQL5 programs. You are trying to open someone else's file sandbox in an MQL5 script.
Реter Konow:
However, the FolderClean() function fails for some reason and the folder with the file is not cleared. As a result, it is not erased by FolderDelete().
For some reason, the operating system won't let me delete the file - it may be opened by another program or it may not have access rights.
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use