No borrar una carpeta si contiene archivos no cerrados

 
 

¿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().

 
Реter Konow:

¿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)?

 
Vladimir Karputov:

¿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? He realizado mi experiencia en MT4.
 
Реter Konow:
No te entiendo muy bien. ¿Qué quieres decir con eso? El experimento se realizó en MT4.

FileOpen:

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.

¿Qué tiene que ver el antiguo terminal, si estás ejecutando código MQL5?
 
Vladimir Karputov:

FileOpen:

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().

 
Vladimir Karputov:

FileOpen:

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.

¿Qué tiene que ver esto con el antiguo terminal si está ejecutando el código MQL5?
No hay diferencia si es MQL4 o MQL5. El código de este script funciona igualmente en ambas plataformas. Lo he probado en MT4.
 
Реter Konow:
No hay diferencia si el código es MQL4 o MQL5. El código de este script funciona igualmente en ambas plataformas. Lo he probado en MT4.

¿Has ejecutado el código MQL5 en el antiguo terminal? Déjame comprobar...

 
Vladimir Karputov:

¿Has ejecutado el código MQL5 en el antiguo terminal? Déjame comprobar...

Créeme, no hay ningún problema con eso.
 
Реter Konow:
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.

PS En general, no dar los registros del programa es obligar a los demás a adivinar por los posos del café