为什么这个脚本中的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中),这不是很令人困惑吗?
文件打开。
注意事项
出于安全考虑,MQL5语言严格控制对文件的操作。使用MQL5语言处理的文件不能在文件 "沙盒 "之外。
在客户终端文件夹的子文件夹MQL5\Files(或在测试的情况下在_agent_testing_directory/MQL5\Files)中打开一个文件。如果在标志中指定了FILE_COMMON,文件会在所有客户终端的公共文件夹(Terminal\Common\Files)中打开。
这个脚本取自文档。
这里是创建文件夹的轨道。
string working_folder=TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL4\\Files";
FolderDelete()函数的一部分起作用,删除了空的文件夹。然而,FolderDelete()函数将不再对有文件的文件夹起作用,因为文件夹内有一个文件,必须首先被删除。为了清除它,我按照说明添加了一个对FolderClean()的调用。然而,FolderClean()函数由于某种原因而失败,带有该文件的文件夹没有被清除。因此,它不会被FolderDelete()清除。
无论代码是MQL4还是MQL5,都没有区别。这个脚本的代码在两个平台上同样适用。我在MT4上测试了它。
你是否在旧终端中运行了MQL5代码?让我检查一下...
你是否在旧终端中运行了MQL5代码?让我检查一下...