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).
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
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.
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//--- входные параметры inputstring firstFolder="empty"; // пустая папка inputstring secondFolder="nonempty";// папка, в которой будет один файл string FolderName="delete_me Folder"; // имя файла, который мы создадим в папке secondFolder string filename="delete_me.txt"; // имя файла, который мы создадим в папке secondFolder //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ voidOnStart()
{
//--- хендл файла запишем сюда 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();
}
elsePrintFormat("Не удалось создать папку %s. Код ошибки %d",working_folder+"\\"+firstFolder, GetLastError());
//--- теперь создадим пустую папку с помощью функции FolderCreatestring filepath=secondFolder+"\\"+FolderName; // сформируем путь для файла, который хотим открыть на запись в несуществующей папке if(FolderCreate(filepath))
{
FolderCreate(filepath + "1");
PrintFormat("Открыли папку %s",working_folder+"\\"+filepath);
}
elsePrintFormat("Не удалось создать папку %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);
}
elsePrintFormat("Не удалось создать файл %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);
elsePrintFormat("Не удалось удалить папку %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());
}
elsePrint("Удаление отменено");
//---
}
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.
Voglio dire, hai creato un EA da uno script e hai provato ad eseguirlo?
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).
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
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.
Dove ho detto quello che ha fatto l'assessore?
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...
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.
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.