No borrar una carpeta si contiene archivos no cerrados - página 4

 
Реter Konow:

Quiero decir, ¿has hecho un EA con un script y has intentado ejecutarlo?

Demasiado perezoso para comprobarlo, pero si pruebas las banderas FILE_SHARE_READ yFILE_SHARE_WRITE
 
A100 Y prueba FILE_COMMON en todas partes

STARIJ ¿Por qué rehacerlo? Me da pereza comprobarlo, pero si pruebas las banderas FILE_SHARE_READ yFILE_SHARE_WRITE

La cuestión es que no está claro qué tienen que ver estas banderas con FolderClean(). En mi opinión, no.

Quiero demostrar que no se trata en absoluto del archivo. Voy a rehacer el script para que cree una carpeta "DeleteMe.txt" en lugar de la carpeta "notempty", y luego borre esta carpeta, tal como intentó hacer con el archivo antes. Vamos a ver si hay alguna diferencia).

Automated Trading and Strategy Testing
Automated Trading and Strategy Testing
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 
Реter Konow:

La cuestión es que no está claro qué tienen que ver estas banderas con FolderClean(). En mi opinión, no.

una carpeta puede ser eliminada si no hay archivos en ella, o si pueden ser eliminados. Estas banderas permiten el acceso al archivo

 
Реter Konow:

Quiero decir, ¿has hecho un EA con un script y has intentado ejecutarlo?

¿Dónde he dicho que he hecho un EA?

 

Tengo que decir que, efectivamente, el cierre explícito del archivo funciona. Supongo que estaba equivocado. La primera vez no funcionó, probablemente porque no guardé una nueva versión del script rediseñado y el cierre explícito no surtió efecto.

Ahora he probado a crear carpetas en lugar de un archivo. Se borraron sin problemas.

Luego se añadió la creación de archivos de nuevo. Resultado: Sin cerrar explícitamente el archivo, la carpeta no es borrada por el script como antes. Con el cierre explícito del archivo, éste se borra por completo.

Por supuesto, esta experiencia no lo explica todo y algunas cosas siguen siendo confusas por ahora, pero este resultado es inspirador.

Seguiré haciendo pruebas e informaré de los resultados.

Todavía puede haber problemas, y es difícil asegurarlo ahora mismo.

 
Alexey Viktorov:

¿Dónde he dicho yo lo que hizo el concejal?

Me disculpo, lo entendí mal.
 

Aquí está el código del script que crea tanto el archivo "DeleteMe.txt" como la "Carpeta DeleteMe". El archivo se cierra explícitamente inmediatamente después de su creación.

Todo parece funcionar...

//+------------------------------------------------------------------+ 
//|                                            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 FolderName="delete_me Folder";       // имя файла, который мы создадим в папке secondFolder 
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());
 
//--- теперь создадим пустую папку с помощью функции FolderCreate 
   string filepath=secondFolder+"\\"+FolderName;  // сформируем путь для файла, который хотим открыть на запись в несуществующей папке 

   if(FolderCreate(filepath)) 
     { 
      FolderCreate(filepath + "1");
      PrintFormat("Открыли папку %s",working_folder+"\\"+filepath); 
     } 
   else 
      PrintFormat("Не удалось создать папку %s в папке %s. Код ошибки=",FolderName,secondFolder, GetLastError());
 /**/
 //--- теперь создадим файл с помощью функции FileOpen() 
   string filepath_2=secondFolder+"\\"+filename;  // сформируем путь для файла, который хотим открыть на запись в несуществующей папке 
   handle=FileOpen(filepath_2,FILE_WRITE|FILE_TXT); // флаг FILE_WRITE в данном случае обязателен, см. справку к функции FileOpen 
   if(handle!=INVALID_HANDLE) 
     {
//*************************************************************************     
   //---- Явно закрываем файл.   
      FileClose(handle);
//*************************************************************************           
      PrintFormat("Открыли файл на чтение %s",working_folder+"\\"+filepath_2); 
     } 
   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("Удаление отменено"); 
//--- 
  }


 
Реter Konow:

Por supuesto, esta experiencia no lo explica todo y algunas cosas siguen siendo vagas por ahora, pero este resultado es inspirador.

Seguiré haciendo pruebas e informaré de los resultados.

Todavía puede haber problemas y es difícil decirlo con seguridad en este momento.

Sí, claro que puedes, y guárdate los detalles, sólo di "he cambiado el ejemplo de la ayuda, nada de nada".

Y seguiremos adivinando, porque cualquiera puede adivinar con troncos. Y es mucho más interesante así.

 
Rashid Umarov:

Sí, por supuesto, escribir. Y los detalles se mantienen a sí mismos, sólo decir "He cambiado un pequeño ejemplo de ayuda, nada en absoluto.

Y seguiremos adivinando, porque con los registros cualquiera puede adivinar, y es mucho más interesante así.

Es raro. No es nada personal. Si estoy siendo poco profesional, lo siento. Aprenderé.

Gracias por su ayuda.


P.D. Nunca he pedido ayuda en el foro. De ahí la inexperiencia.

 

Recuerdo tu "tengo todas las jugadas escritas" en el hilo de la programación OOP vs procedimental. En este hilo acabé de convencerme de que no se puede confiar en ti.

No hay pruebas ni detalles: no es necesario escribir a servicedesk.

Razón de la queja: