Por que a função FolderClean() neste script falha?
//+------------------------------------------------------------------+ //| 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("Удаление отменено"); //--- }
Uma tentativa de limpar uma pasta resulta em erro 5026 - (pasta não pode ser limpa).
Este roteiro é retirado da documentação (seção de FolderDelete()) e ligeiramente modificado. Uma pasta que contenha outras subpastas ou arquivos deve ser limpa para ser completamente removida. Uma chamada para FolderClean() é acrescentada para este fim.
Por que a função FolderClean() neste script falha?
Uma tentativa de limpar uma pasta resulta em erro 5026 - (pasta não pode ser limpa).
Este roteiro é retirado da documentação (seção da função FolderDelete()) e ligeiramente modificado. Para apagar completamente uma pasta que contenha outras subpastas ou arquivos, você deve limpá-la. Uma chamada para FolderClean() é acrescentada para este fim.
Não lhe incomoda que você esteja tentando entrar na caixa de areia de outra pessoa (na MQL4)?
Não é confuso que você esteja tentando entrar na caixa de areia de outra pessoa (em MQL4)?
Eu não o entendo muito bem. O que você quer dizer com isso? A experiência foi feita no MT4.
Nota
Por razões de segurança, a linguagem MQL5 controla estritamente as operações com arquivos. Os arquivos que são tratados utilizando a linguagem MQL5 não podem estar fora do arquivo "sandbox".
Um arquivo é aberto na pasta do terminal do cliente na subpasta MQL5\Files (ou no_agent_testing_directory\MQL5\Files em caso de teste). Se FILE_COMMON for especificado entre as bandeiras, o arquivo será aberto na pasta comum de todos os terminais do cliente Arquivos Comuns.
Nota
Por razões de segurança, a linguagem MQL5 controla estritamente as operações com arquivos. Os arquivos que são tratados utilizando a linguagem MQL5 não podem estar fora do arquivo "sandbox".
Um arquivo é aberto na pasta do terminal do cliente na subpasta MQL5\Files (ou no_agent_testing_directory\MQL5\Files em caso de teste). Se FILE_COMMON for especificado entre as bandeiras, o arquivo se abre na pasta comum de todos os terminais do cliente Arquivos Comuns.
Este roteiro é extraído da documentação.
Aqui está a pista na qual as pastas são criadas:
string working_folder=TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL4\\Files";
Parte da função FolderDelete() funciona e apaga a pasta que está vazia. Entretanto, a função FolderDelete() não funcionará mais em uma pasta com um arquivo porque há um arquivo dentro da pasta que deve ser apagado primeiro. Para apagá-lo, acrescentei uma chamada ao FolderClean() de acordo com as instruções. Entretanto, a função FolderClean() falha por algum motivo e a pasta com o arquivo não é limpa. Como resultado, ela não é apagada por FolderDelete().
Nota
Por razões de segurança, a linguagem MQL5 controla estritamente as operações com arquivos. Os arquivos que são tratados utilizando a linguagem MQL5 não podem estar fora do arquivo "sandbox".
Um arquivo é aberto na pasta do terminal do cliente na subpasta MQL5\Files (ou no_agent_testing_directory\MQL5\Files em caso de teste). Se FILE_COMMON for especificado entre as bandeiras, o arquivo se abre na pasta comum de todos os terminais do cliente Arquivos Comuns.
Não há diferença se o código é MQL4 ou MQL5. O código deste roteiro funciona igualmente em ambas as plataformas. Testei-o no MT4.
Você executou o código MQL5 no terminal antigo? Deixe-me verificar ...
Você executou o código MQL5 no terminal antigo? Deixe-me verificar ...
Acredite-me, não há problema com isso.
O que eu tinha que provar: o terminal antigo NÃO VÊ programas MQL5. Você está tentando abrir a caixa de areia do arquivo de outra pessoa em um script MQL5.
Реter Konow:
Entretanto, a função FolderClean() falha por algum motivo e a pasta com o arquivo não é limpa. Como resultado, ela não é apagada por FolderDelete().
Por algum motivo, o sistema operacional não me deixa apagar o arquivo - ele pode ser aberto por outro programa ou pode não ter direitos de acesso.
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso