Una cartella non viene cancellata se contiene file non chiusi

 
 

Perché la funzione FolderClean() in questo script fallisce?

//+------------------------------------------------------------------+ 
//|                                            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("Удаление отменено"); 
//--- 
  }

Un tentativo di pulire una cartella dà come risultato l'errore 5026 - (la cartella non può essere pulita).

Questo script è preso dalla documentazione (sezione di FolderDelete()) e leggermente modificato. Una cartella che contiene altre sottocartelle o file deve essere cancellata per rimuoverla completamente. Viene aggiunta una chiamata a FolderClean() per questo scopo.

 
Реter Konow:

Perché la funzione FolderClean() in questo script fallisce?

Un tentativo di cancellare una cartella dà come risultato l'errore 5026 - (la cartella non può essere cancellata).

Questo script è preso dalla documentazione (sezione della funzione FolderDelete()) e leggermente modificato. Per eliminare completamente una cartella che contiene altre sottocartelle o file, è necessario cancellarla. Viene aggiunta una chiamata a FolderClean() per questo scopo.


Non vi dà fastidio che state cercando di entrare nella sandbox di qualcun altro (in MQL4)?

 
Vladimir Karputov:

Non ti confonde il fatto che stai cercando di entrare nella sandbox di qualcun altro (in MQL4)?

Non ti capisco bene. Cosa vuoi dire? Ho eseguito la mia esperienza su MT4.
 
Реter Konow:
Non ti capisco bene. Cosa vuoi dire con questo. L'esperimento è stato fatto su MT4.

FileOpen:

Nota

Per ragioni di sicurezza, il linguaggio MQL5 controlla strettamente le operazioni con i file. I file che sono gestiti utilizzando il linguaggio MQL5 non possono essere al di fuori della "sandbox" dei file.

Un file viene aperto nella cartella del terminale del cliente nella sottocartella MQL5\Files (o nella directory_agent_testing_MQL5\Files in caso di test). Se FILE_COMMON è specificato tra i flag, il file sarà aperto nella cartella comune di tutti i terminali client \Terminal\Common\Files.

Cosa c'entra il vecchio terminale, se state eseguendo codice MQL5?
 
Vladimir Karputov:

FileOpen:

Nota

Per ragioni di sicurezza, il linguaggio MQL5 controlla strettamente le operazioni con i file. I file che vengono gestiti utilizzando il linguaggio MQL5 non possono essere al di fuori della "sandbox" dei file.

Un file viene aperto nella cartella del terminale del cliente nella sottocartella MQL5\Files (o nella directory_agent_testing_MQL5\Files in caso di test). Se FILE_COMMON è specificato tra i flag, il file viene aperto nella cartella comune di tutti i terminali client \Terminal\Common\Files.

Questo script è preso dalla documentazione.

Ecco la traccia in cui vengono create le cartelle:

string working_folder=TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL4\\Files"; 

Parte della funzione FolderDelete() funziona e cancella la cartella che è vuota. Tuttavia, la funzione FolderDelete() non funziona più su una cartella con un file perché c'è un file all'interno della cartella che deve essere prima cancellato. Per cancellarlo, ho aggiunto una chiamata a FolderClean() come da istruzioni. Tuttavia, la funzione FolderClean() fallisce per qualche motivo e la cartella con il file non viene cancellata. Di conseguenza, non viene cancellato da FolderDelete().

 
Vladimir Karputov:

FileOpen:

Nota

Per ragioni di sicurezza, il linguaggio MQL5 controlla strettamente le operazioni con i file. I file che sono gestiti utilizzando il linguaggio MQL5 non possono essere al di fuori della "sandbox" dei file.

Un file viene aperto nella cartella del terminale del cliente nella sottocartella MQL5\Files (o nella directory_agent_testing_MQL5\Files in caso di test). Se FILE_COMMON è specificato tra i flag, il file si apre nella cartella comune di tutti i terminali client \Terminal\Common\Files.

Cosa ha a che fare questo con il vecchio terminale se si sta eseguendo il codice MQL5?
Non c'è differenza se è MQL4 o MQL5. Il codice di questo script funziona ugualmente su entrambe le piattaforme. L'ho testato su MT4.
 
Реter Konow:
Non c'è differenza se il codice è MQL4 o MQL5. Il codice di questo script funziona ugualmente su entrambe le piattaforme. L'ho testato su MT4.

Hai eseguito il codice MQL5 nel vecchio terminale? Lasciami controllare ...

 
Vladimir Karputov:

Hai eseguito il codice MQL5 nel vecchio terminale? Lasciami controllare ...

Credetemi, non c'è nessun problema.
 
Реter Konow:
Credetemi, non c'è nessun problema.

Quello che ho dovuto provare: il vecchio terminale NON VEDE i programmi MQL5. Stai cercando di aprire il file sandbox di qualcun altro in uno script MQL5.

 

Реter Konow:

Tuttavia, la funzione FolderClean() fallisce per qualche motivo e la cartella con il file non viene cancellata. Di conseguenza, non viene cancellato da FolderDelete().

Per qualche ragione, il sistema operativo non mi permette di cancellare il file - potrebbe essere aperto da un altro programma o potrebbe non avere diritti di accesso.

PS In generale, non dare i log del programma è costringere gli altri a indovinare dai fondi di caffè