Una cartella non viene cancellata se contiene file non chiusi - pagina 4

 
Реter Konow:

Voglio dire, hai creato un EA da uno script e hai provato ad eseguirlo?

Troppo pigro per controllare, ma se provate i flag FILE_SHARE_READ eFILE_SHARE_WRITE
 
A100 E prova FILE_COMMON ovunque

STARIJ Perché rifarlo? Sono troppo pigro per controllare, ma se provate i flag FILE_SHARE_READ eFILE_SHARE_WRITE

Il fatto è che non è chiaro cosa questi flag abbiano a che fare con FolderClean(). Per niente, secondo me.

Voglio dimostrare che non si tratta affatto del file. Rifarò lo script, in modo che crei una cartella "DeleteMe.txt" invece della cartella "notempty", e poi cancelli questa cartella, proprio come ha cercato di fare con il file prima. Vediamo se fa la differenza).

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:

Il fatto è che non è chiaro cosa questi flag abbiano a che fare con FolderClean(). Per niente, secondo me.

una cartella può essere cancellata se non ci sono file in essa, o se questi possono essere rimossi. Queste bandiere permettono l'accesso al file

 
Реter Konow:

Voglio dire, hai creato un EA da uno script e hai provato ad eseguirlo?

Dove ho detto che ho fatto un EA?

 

Devo dire che in effetti, chiudere esplicitamente il file funziona. Credo di essermi sbagliato. La prima volta non ha funzionato, probabilmente perché non ho salvato una nuova versione dello script ridisegnato e la chiusura esplicita non ha avuto effetto.

Ora ho provato a creare cartelle invece di un file. Si sono cancellati senza problemi.

Poi ha aggiunto di nuovo la creazione di file. Risultato: senza chiudere esplicitamente il file, la cartella non viene cancellata dallo script come prima. Con la chiusura esplicita del file, esso viene cancellato completamente.

Naturalmente, questa esperienza non spiega tutto e alcune cose rimangono nebulose per ora, ma questo risultato è stimolante.

Continuerò a testare e riferirò i risultati.

Potrebbero esserci ancora problemi, ed è difficile dirlo con certezza in questo momento.

 
Alexey Viktorov:

Dove ho detto quello che ha fatto l'assessore?

Mi scuso, ho capito male.
 

Ecco il codice dello script che crea sia il file "DeleteMe.txt" che "DeleteMe Folder". Il file si chiude esplicitamente subito dopo la creazione.

Tutto sembra funzionare...

//+------------------------------------------------------------------+ 
//|                                            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:

Certo, questa esperienza non spiega tutto e alcune cose rimangono vaghe per ora, ma questo risultato è stimolante.

Continuerò i test e riferirò i risultati.

Potrebbero esserci ancora problemi ed è difficile dirlo con certezza al momento.

Sì, certo che puoi, e tieni i dettagli per te, basta dire "ho cambiato l'esempio dell'aiuto, niente di niente".

E continueremo a indovinare - perché chiunque può indovinare con i registri, ed è molto più interessante in questo modo.

 
Rashid Umarov:

E i dettagli si tengono per sé, basta dire "ho cambiato un piccolo esempio di aiuto, niente di niente".

E continueremo a indovinare - perché con i log chiunque può indovinare, ed è molto più interessante in questo modo.

Strano. Non è niente di personale. Se sono poco professionale, mi dispiace. Imparerò.

Grazie per il vostro aiuto.


P.S. Non ho mai chiesto aiuto sul forum. Da qui l'inesperienza.

 

Mi ricordo il tuo "ho tutte le mosse scritte" nel thread OOP vs. programmazione procedurale. In questo thread ero solo convinto che non ci si può fidare di te.

Non c'è nessuna prova e nessun dettaglio - non c'è bisogno di scrivere a servicedesk.

Motivazione: