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

 
Rashid Umarov:

由于某些原因,操作系统不允许删除该文件--要么它被其他程序打开,要么它没有得到足够的授权。

正是这样。当我试图删除一个已经包含子文件夹和文件的文件夹时,我会先删除文件。只留下子文件夹。我尝试用FolderClean()清理它们,然后调用FolderDelete()。然而,结果是那些空的子文件夹被很好地删除了,但如果子文件夹里面有更多的子文件夹,则不会被删除。之后,我试图从MetaEditor的文件导航器中手动删除这些文件夹,但终端并没有删除它们,而是弹出这个窗口。

我点击 "继续",同意修改,但文件夹仍然没有被删除。在完全关闭并重新打开终端后,应该被删除的文件夹要么自己消失,要么不消失,但你可以在没有上述窗口的情况下立即手动删除它们。

这样的怪事...

 
Vladimir Karputov:

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

这些功能在两个终端上的作用是相同的。使用运行脚本的终端的文件沙盒。这些是使用中的终端的本地文件。相信我,这绝对不是一个问题......
 
Rashid Umarov:


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

看一下这个GIF。



我在上面给出了这个脚本的代码,在上一页。

 

我应该补充的是,我试图先用软件擦除,然后手动擦除的文件夹并没有在任何地方打开。此外,除了MetaEditor中的文件导航器本身,它们不能在任何地方打开,因为它们是空的,其中的文件以前被删除了。被删除的文件也没有在任何地方被打开过。

要求管理员批准手动删除MetaEditor中的文件导航器中的文件夹的窗口,只在试图删除那些程序先前试图使用FolderClean() 和FolderDelete()删除的文件夹时出现。当试图删除其他文件夹时,这个窗口从未出现。

 
Реter Konow:

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

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

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

我可以问为什么没有文件关闭吗?还是我只是没有看到它?

下面是你从打开文件到要求删除的代码片段...

   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() нельзя использовать в индикаторах!
 
//--- выведем диалоговое окно и просим пользователя 
 
Alexey Viktorov:

请问,为什么没有关闭文件?还是我只是没有看到它?

下面是你从打开文件到删除问题的代码片段...

据我所知,如果没有使用文件函数(如FileWrite())对文件进行修改,就没有必要关闭它。FileOpen()函数只是创建一个新的文件,这个操作不需要关闭文件(这个函数的文档也没有说在创建后要关闭文件)。此外,这个脚本取自于文档,我没有在那里做任何改动。我只是用FolderClean()函数 添加了几行。
 
Реter Konow:
据我所知,如果使用FileWrite()没有对文件进行修改,就没有必要关闭它。FileOpen()函数只是创建一个新的文件,这个操作并不要求关闭文件。此外,这个脚本取自文档,我没有在那里做任何改动。我只是用FolderClean()函数 添加了几行。

但如果你用调试器查看代码,你会发现在FileOpen()执行后,磁盘上立即出现了一个大小为空的文件。而且文件中存在相当多的错误和不准确之处。

 
Alexey Viktorov:

但如果你用调试器查看代码,在FileOpen()执行后,磁盘上就有一个零大小的文件。而且文件中存在相当多的错误和不准确之处。

所以在这个例子中,它应该是零尺寸。

现在我将尝试在脚本中明确关闭该文件,然后再试一次。

 
Реter Konow:

所以在这个例子中,它应该是零尺寸。

我打算在脚本中尝试明确关闭文件,然后再试一下。

我很少看样本代码,而且我已经删除了这个文件夹,没有任何问题。因此,99%的人肯定这就是问题所在。
 

其结果是一样的。

以下是新的代码。

//+------------------------------------------------------------------+ 
//|                                            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) 
     {
//*************************************************************************     
   //---- Явно закрываем файл.   
      FileClose(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("Удаление отменено"); 
//--- 
  }