- Общайтесь с разработчиками через Сервисдеск!
- Как решаются вопросы в сервис-деске
- Сервисы. Уже работают?
Почему не срабатывает функция FolderClean() вот в этом скрипте: ?
//+------------------------------------------------------------------+ //| 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("Удаление отменено"); //--- }
В результате попытки очищения папки, выдает ошибку 5026 - (папка не может быть очищена).
Данный скрипт взят из документации (раздел функции FolderDelete()) и слегка модифицирован. Для полного удаления папки, которая содержит в себе другие подпапки или файлы необходимо ее очистить. Для этого добавлен вызов функции FolderClean().
Почему не срабатывает функция FolderClean() вот в этом скрипте: ?
В результате попытки очищения папки, выдает ошибку 5026 - (папка не может быть очищена).
Данный скрипт взят из документации (раздел функции FolderDelete()) и слегка модифицирован. Для полного удаления папки, которая содержит в себе другие подпапки или файлы необходимо ее очистить. Для этого добавлен вызов функции FolderClean().
А не смущает, то что Вы пытаетесь попасть в чужую песочницу (в MQL4)?
А не смущает, то что Вы пытаетесь попасть в чужую песочницу (в MQL4)?
Не совсем понял Вас. Что Вы имеете ввиду. Опыт проводил на МТ4.
Примечание
Из соображений безопасности в языке MQL5 строго контролируется работа с файлами. Файлы, с которыми проводятся файловые операции средствами языка MQL5, не могут находиться за пределами файловой "песочницы".
Файл открывается в папке клиентского терминала в подпапке MQL5\Files (или каталог_агента_тестирования\MQL5\Files в случае тестирования). Если среди флагов указан FILE_COMMON, то файл открывается в общей папке всех клиентских терминалов \Terminal\Common\Files.
Примечание
Из соображений безопасности в языке MQL5 строго контролируется работа с файлами. Файлы, с которыми проводятся файловые операции средствами языка MQL5, не могут находиться за пределами файловой "песочницы".
Файл открывается в папке клиентского терминала в подпапке MQL5\Files (или каталог_агента_тестирования\MQL5\Files в случае тестирования). Если среди флагов указан FILE_COMMON, то файл открывается в общей папке всех клиентских терминалов \Terminal\Common\Files.
Этот скрипт взят из документации.
Вот дорожка в которой создаются папки:
string working_folder=TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL4\\Files";
Частично функция FolderDelete() срабатывает и стирает ту папку, которая пуста. Однако, на папке с файлом функция FolderDelete() уже не срабатывает, потому что внутри папки есть файл и он должен быть предварительно стерт. Для его стирания я добавил вызов функции FolderClean(), как положено по инструкции. Однако, функция FolderClean() почему то не срабатывает и папка с файлом не очищается. В следствии этого она и не стирается функцией FolderDelete().
Примечание
Из соображений безопасности в языке MQL5 строго контролируется работа с файлами. Файлы, с которыми проводятся файловые операции средствами языка MQL5, не могут находиться за пределами файловой "песочницы".
Файл открывается в папке клиентского терминала в подпапке MQL5\Files (или каталог_агента_тестирования\MQL5\Files в случае тестирования). Если среди флагов указан FILE_COMMON, то файл открывается в общей папке всех клиентских терминалов \Terminal\Common\Files.
Разницы в том какой код - MQL4 или MQL5, здесь нет. Код этого скрипта одинаково работает на обеих платформах. Я тестировал на МТ4.
Вы MQL5 код запустили в старом терминале? Сейчас проверю ...
Вы MQL5 код запустили в старом терминале? Сейчас проверю ...
Поверьте, с этим проблем нет.
Что и требовалось доказать: старый терминал НЕ ВИДИТ MQL5 программы. Вы в MQL5 скрипте пытаетесь открыть чужую файловую песочницу.
Реter Konow:
Однако, функция FolderClean() почему то не срабатывает и папка с файлом не очищается. В следствии этого она и не стирается функцией FolderDelete().
По какой-то причину операционная система не дает удалить файл - то ли он открыт другой программой, то ли прав не хватает.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования