Não apagar uma pasta se ela contiver arquivos não fechados - página 4

 
Реter Konow:

Quero dizer, você fez um EA a partir de um roteiro e tentou executá-lo?

Por que refazê-lo? Demasiado preguiçoso para verificar, mas se você tentar as bandeiras FILE_SHARE_READ eFILE_SHARE_WRITE
 
A100 E tente FILE_COMMON em qualquer lugar

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).

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:

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

 
Реter Konow:

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.

 
Alexey Viktorov:

Onde eu disse o que o conselheiro fez?

Peço desculpas, eu entendi mal.
 

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 
//--- входные параметры 
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:

É 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.

 
Rashid Umarov:

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.