STARIJ Por que refazê-lo? Sou preguiçoso demais para verificar, mas se você tentar as bandeiras FILE_SHARE_READ eFILE_SHARE_WRITE
A questão é que não está claro o que estas bandeiras têm a ver com FolderClean(). De modo algum, em minha opinião.
Quero provar que não se trata de forma alguma do arquivo. Vou refazer o roteiro, para que ele crie uma pasta "DeleteMe.txt" ao invés da pasta "notempty", e depois apague esta pasta, assim como tentou fazer com o arquivo antes. Vamos ver se isso faz alguma diferença).
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 dizer que, de fato, fechar explicitamente o arquivo funciona. Acho que eu estava errado. A primeira vez não funcionou, provavelmente porque eu não salvei uma nova versão do roteiro redesenhado e o fechamento explícito não teve efeito.
Agora eu tentei criar pastas ao invés de um arquivo. Elas foram apagadas sem nenhum problema.
Em seguida, acrescentou novamente a criação do arquivo. Resultado: Sem fechar explicitamente o arquivo, a pasta não é apagada pelo script como antes. Com o fechamento explícito do arquivo, ele é apagado completamente.
É claro que esta experiência não explica tudo e algumas coisas permanecem obscuras por enquanto, mas este resultado é inspirador.
Continuarei testando e informarei os resultados.
Ainda pode haver problemas, e é difícil dizer com certeza neste momento.
Aqui está o código do script que cria tanto o arquivo "DeleteMe.txt" quanto o arquivo "DeleteMe Folder". O arquivo é explicitamente fechado imediatamente após a criação.
Tudo 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//--- входные параметры 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("Удаление отменено");
//---
}
Lembro-me de seu "eu tenho todos os movimentos escritos" no tópico de programação OOP vs procedimento. Neste tópico eu estava apenas convencido de que você não pode ser confiável.
Não há nenhuma prova e nenhum detalhe - não há necessidade de escrever para Servicedesk.
Quero dizer, você fez um EA a partir de um roteiro e tentou executá-lo?
A questão é que não está claro o que estas bandeiras têm a ver com FolderClean(). De modo algum, em minha opinião.
Quero provar que não se trata de forma alguma do arquivo. Vou refazer o roteiro, para que ele crie uma pasta "DeleteMe.txt" ao invés da pasta "notempty", e depois apague esta pasta, assim como tentou fazer com o arquivo antes. Vamos ver se isso faz alguma diferença).
A questão é que não está claro o que estas bandeiras têm a ver com FolderClean(). De modo algum, em minha opinião.
uma pasta pode ser apagada se não houver arquivos nela, ou se eles puderem ser removidos. Estas bandeiras permitem o acesso ao arquivo
Quero dizer, você fez um EA a partir de um roteiro e tentou executá-lo?
Onde eu disse que fiz um EA?
Devo dizer que, de fato, fechar explicitamente o arquivo funciona. Acho que eu estava errado. A primeira vez não funcionou, provavelmente porque eu não salvei uma nova versão do roteiro redesenhado e o fechamento explícito não teve efeito.
Agora eu tentei criar pastas ao invés de um arquivo. Elas foram apagadas sem nenhum problema.
Em seguida, acrescentou novamente a criação do arquivo. Resultado: Sem fechar explicitamente o arquivo, a pasta não é apagada pelo script como antes. Com o fechamento explícito do arquivo, ele é apagado completamente.
É claro que esta experiência não explica tudo e algumas coisas permanecem obscuras por enquanto, mas este resultado é inspirador.
Continuarei testando e informarei os resultados.
Ainda pode haver problemas, e é difícil dizer com certeza neste momento.
Onde eu disse o que o conselheiro fez?
Aqui está o código do script que cria tanto o arquivo "DeleteMe.txt" quanto o arquivo "DeleteMe Folder". O arquivo é explicitamente fechado imediatamente após a criação.
Tudo parece funcionar...
É claro que esta experiência não explica tudo e algumas coisas permanecem vagas por enquanto, mas este resultado é inspirador.
Continuarei os testes e informarei os resultados.
Ainda pode haver problemas e é difícil dizer com certeza no momento.
Sim, é claro que você pode, e guarde os detalhes para si mesmo, basta dizer "Eu mudei o exemplo da ajuda, nada mesmo".
E vamos continuar adivinhando - porque qualquer um pode adivinhar com troncos. E é muito mais interessante assim.
Sim, claro, escreva. E os detalhes guardam para si mesmos, basta dizer "mudei um pequeno exemplo de ajuda, nada mesmo.
E vamos continuar adivinhando - porque com troncos qualquer um pode adivinhar, e é muito mais interessante assim.
Estranho. Não é nada pessoal. Se estou sendo pouco profissional, peço desculpas. Eu vou aprender.
Obrigado por sua ajuda.
P.S. Eu simplesmente nunca pedi ajuda no fórum. Daí a inexperiência.
Lembro-me de seu "eu tenho todos os movimentos escritos" no tópico de programação OOP vs procedimento. Neste tópico eu estava apenas convencido de que você não pode ser confiável.
Não há nenhuma prova e nenhum detalhe - não há necessidade de escrever para Servicedesk.