¿Por qué falla la función FolderClean() de este script?
//+------------------------------------------------------------------+ //| 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("Удаление отменено"); //--- }
Al intentar limpiar una carpeta se produce el error 5026 - (no se puede limpiar la carpeta).
Este script está tomado de la documentación (sección de FolderDelete()) y ligeramente modificado. Una carpeta que contiene otras subcarpetas o archivos debe ser borrada para eliminarla completamente. Para ello se añade una llamada a FolderClean().
¿Por qué falla la función FolderClean() de este script?
Al intentar limpiar una carpeta se produce el error 5026 - (no se puede limpiar la carpeta).
Este script está tomado de la documentación (sección de la función FolderDelete()) y ligeramente modificado. Para eliminar completamente una carpeta que contiene otras subcarpetas o archivos, debes borrarla. Para ello se añade una llamada a FolderClean().
¿No te molesta que estés tratando de entrar en la caja de arena de otra persona (en MQL4)?
¿No es confuso que estés tratando de entrar en la caja de arena de otra persona (en MQL4)?
No te entiendo muy bien. ¿Qué quieres decir con eso? El experimento se realizó en MT4.
Nota
Por razones de seguridad, el lenguaje MQL5 controla estrictamente las operaciones con archivos. Los archivos que se manejan con el lenguaje MQL5 no pueden estar fuera de la "caja de arena" de archivos.
Se abre un archivo en la carpeta del terminal del cliente en la subcarpeta MQL5\Files (o en el directorio del agente_de_prueba\MQL5\Files en caso de prueba). Si se especifica FILE_COMMON entre las banderas, el archivo se abrirá en la carpeta común de todos los terminales cliente \Terminal\Common\Files.
Nota
Por razones de seguridad, el lenguaje MQL5 controla estrictamente las operaciones con archivos. Los archivos que se manejan con el lenguaje MQL5 no pueden estar fuera de la "caja de arena" de archivos.
Se abre un archivo en la carpeta del terminal del cliente en la subcarpeta MQL5\Files (o en el directorio del agente_de_prueba\MQL5\Files en caso de prueba). Si se especifica FILE_COMMON entre las banderas, el archivo se abre en la carpeta común de todos los terminales cliente \Terminal\Common\Files.
Este script está tomado de la documentación.
Aquí está la pista en la que se crean las carpetas:
string working_folder=TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL4\\Files";
Parte de la función FolderDelete() funciona y borra la carpeta que está vacía. Sin embargo, la función FolderDelete() ya no funcionará en una carpeta con un archivo porque hay un archivo dentro de la carpeta que debe ser borrado primero. Para borrarlo, he añadido una llamada a FolderClean() según las instrucciones. Sin embargo, la función FolderClean() falla por alguna razón y la carpeta con el archivo no se borra. Como resultado, no es borrado por FolderDelete().
Nota
Por razones de seguridad, el lenguaje MQL5 controla estrictamente las operaciones con archivos. Los archivos que se manejan con el lenguaje MQL5 no pueden estar fuera de la "caja de arena" de archivos.
Se abre un archivo en la carpeta del terminal del cliente en la subcarpeta MQL5\Files (o en el directorio del agente_de_prueba\MQL5\Files en caso de prueba). Si se especifica FILE_COMMON entre las banderas, el archivo se abre en la carpeta común de todos los terminales cliente \Terminal\Common\Files.
¿Has ejecutado el código MQL5 en el antiguo terminal? Déjame comprobar...
Créeme, no hay ningún problema con eso.
Lo que tenía que probar: el viejo terminal NO VE los programas MQL5. Estás tratando de abrir la caja de arena de archivos de otra persona en un script MQL5.
Реter Konow:
Sin embargo, la función FolderClean() falla por alguna razón y la carpeta con el archivo no se borra. Como resultado, no es borrado por FolderDelete().
Por alguna razón, el sistema operativo no me deja eliminar el archivo: puede que esté abierto por otro programa o que no tenga derechos de acceso.
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso