如果一个文件夹包含未关闭的文件,则不删除该文件夹

 
 

为什么这个脚本中的FolderClean()函数会失败?

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

试图清理一个文件夹的结果是错误5026--(文件夹不能被清理)。

这个脚本取自文档(FolderDelete() 部分),并稍作修改。一个包含其他子文件夹或文件的文件夹必须被清除,以彻底删除它。为此,增加了对FolderClean()的调用。

 
Реter Konow:

为什么这个脚本中的FolderClean()函数会失败?

试图清理一个文件夹的结果是错误5026--(文件夹不能被清理)。

这个脚本取自文档(FolderDelete()函数的 部分),并稍作修改。要彻底删除一个包含其他子文件夹或文件的文件夹,你应该清除它。为此,增加了对FolderClean()的调用。


你试图进入别人的沙盒(在MQL4中),这难道不让你感到不安吗?

 
Vladimir Karputov:

你试图进入别人的沙盒(在MQL4中),这不是很令人困惑吗?

我不太理解你。你是什么意思?我在MT4上执行了我的经验。
 
Реter Konow:
我不太理解你。你这话是什么意思。实验是在MT4上进行的。

文件打开

注意事项

出于安全考虑,MQL5语言严格控制对文件的操作。使用MQL5语言处理的文件不能在文件 "沙盒 "之外。

在客户终端文件夹的子文件夹MQL5\Files(或在测试的情况下在_agent_testing_directory/MQL5\Files)中打开一个文件。如果在标志中指定了FILE_COMMON,该文件将在所有客户终端的公共文件夹(Terminal\Common\Files)中打开

如果你运行的是MQL5代码,与旧终端有什么关系?
 
Vladimir Karputov:

文件打开

注意事项

出于安全考虑,MQL5语言严格控制对文件的操作。使用MQL5语言处理的文件不能在文件 "沙盒 "之外。

在客户终端文件夹的子文件夹MQL5\Files(或在测试的情况下在_agent_testing_directory/MQL5\Files)中打开一个文件。如果在标志中指定了FILE_COMMON,文件会在所有客户终端的公共文件夹(Terminal\Common\Files)中打开

这个脚本取自文档。

这里是创建文件夹的轨道。

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

FolderDelete()函数的一部分起作用,删除了空的文件夹。然而,FolderDelete()函数将不再对有文件的文件夹起作用,因为文件夹内有一个文件,必须首先被删除。为了清除它,我按照说明添加了一个对FolderClean()的调用。然而,FolderClean()函数由于某种原因而失败,带有该文件的文件夹没有被清除。因此,它不会被FolderDelete()清除。

 
Vladimir Karputov:

文件打开

注意事项

出于安全考虑,MQL5语言严格控制对文件的操作。使用MQL5语言处理的文件不能在文件 "沙盒 "之外。

在客户终端文件夹的子文件夹MQL5\Files(或在测试的情况下在_agent_testing_directory/MQL5\Files)中打开一个文件。如果在标志中指定了FILE_COMMON,文件会在所有客户终端的公共文件夹(Terminal\Common\Files)中打开

如果你正在运行MQL5代码,这与旧终端有什么关系?
无论是MQL4还是MQL5,都没有区别。这个脚本的代码在两个平台上同样适用。我在MT4上测试了它。
 
Реter Konow:
无论代码是MQL4还是MQL5,都没有区别。这个脚本的代码在两个平台上同样适用。我在MT4上测试了它。

你是否在旧终端中运行了MQL5代码?让我检查一下...

 
Vladimir Karputov:

你是否在旧终端中运行了MQL5代码?让我检查一下...

相信我,这没有什么问题。
 
Реter Konow:
相信我,这没有什么问题。

我必须证明的是:旧的终端不能看到MQL5程序。你正试图在MQL5脚本 中打开别人的文件沙盒。

 

Реter Konow:

然而,FolderClean()函数由于某种原因而失败,带有该文件的文件夹没有被清除。因此,它不会被FolderDelete()抹去。

由于某些原因,操作系统不让我删除该文件--它可能被其他程序打开,或者没有访问权限。

PS 一般来说,不给程序日志就是强迫别人用咖啡渣来猜测