Ein Ordner wird nicht gelöscht, wenn er nicht geschlossene Dateien enthält.

 
 

Warum schlägt die Funktion FolderClean() in diesem Skript fehl?

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

Der Versuch, einen Ordner zu bereinigen, führt zu Fehler 5026 - (Ordner kann nicht bereinigt werden).

Dieses Skript ist der Dokumentation (Abschnitt von FolderDelete()) entnommen und leicht verändert. Ein Ordner, der andere Unterordner oder Dateien enthält, muss geleert werden, um ihn vollständig zu entfernen. Zu diesem Zweck wird ein Aufruf von FolderClean() hinzugefügt.

 
Реter Konow:

Warum schlägt die Funktion FolderClean() in diesem Skript fehl?

Der Versuch, einen Ordner zu löschen, führt zu Fehler 5026 - (Ordner kann nicht gelöscht werden).

Dieses Skript ist der Dokumentation (Abschnitt der Funktion FolderDelete()) entnommen und leicht verändert. Um einen Ordner, der andere Unterordner oder Dateien enthält, vollständig zu löschen, sollten Sie ihn leeren. Zu diesem Zweck wird ein Aufruf von FolderClean() hinzugefügt.


Stört es Sie nicht, dass Sie versuchen, die Sandbox eines anderen zu betreten (in MQL4)?

 
Vladimir Karputov:

Ist es nicht verwirrend, dass Sie versuchen, in den Sandkasten eines anderen zu gelangen (in MQL4)?

Ich kann Sie nicht ganz verstehen. Wie meinen Sie das? Ich habe meine Erfahrungen mit MT4 gemacht.
 
Реter Konow:
Ich kann Sie nicht ganz verstehen. Was meinen Sie damit? Das Experiment wurde mit MT4 durchgeführt.

FileOpen:

Hinweis

Aus Sicherheitsgründen kontrolliert die Sprache MQL5 Operationen mit Dateien streng. Die Dateien, die mit der MQL5-Sprache bearbeitet werden, können sich nicht außerhalb der Datei-Sandbox" befinden.

Eine Datei wird im Client-Terminal-Ordner im Unterordner MQL5\Files (oder im Agent-Testing-Verzeichnis\MQL5\Files im Falle von Tests) geöffnet. Wenn unter den Flags FILE_COMMON angegeben ist, wird die Datei im gemeinsamen Ordner aller Client-Terminals \Terminal\Common\Files geöffnet.

Was hat das alte Terminal damit zu tun, wenn Sie MQL5-Code ausführen?
 
Vladimir Karputov:

FileOpen:

Hinweis

Aus Sicherheitsgründen kontrolliert die Sprache MQL5 Operationen mit Dateien streng. Die Dateien, die mit der MQL5-Sprache bearbeitet werden, können sich nicht außerhalb der Datei-Sandbox" befinden.

Eine Datei wird im Client-Terminal-Ordner im Unterordner MQL5\Files (oder im Agent-Testing-Verzeichnis\MQL5\Files im Falle von Tests) geöffnet. Wenn unter den Flags FILE_COMMON angegeben ist, wird die Datei im gemeinsamen Ordner aller Client-Terminals \Terminal\Common\Files geöffnet.

Dieses Skript ist der Dokumentation entnommen.

Hier ist der Weg, auf dem die Ordner erstellt werden:

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

Ein Teil der Funktion FolderDelete() funktioniert und löscht den Ordner, der leer ist. Die Funktion FolderDelete() funktioniert jedoch nicht mehr bei einem Ordner mit einer Datei, da sich innerhalb des Ordners eine Datei befindet, die zuerst gelöscht werden muss. Um sie zu löschen, habe ich einen Aufruf von FolderClean() gemäß den Anweisungen hinzugefügt. Die Funktion FolderClean() schlägt jedoch aus irgendeinem Grund fehl und der Ordner mit der Datei wird nicht gelöscht. Folglich wird er nicht durch FolderDelete() gelöscht.

 
Vladimir Karputov:

FileOpen:

Hinweis

Aus Sicherheitsgründen kontrolliert die Sprache MQL5 Operationen mit Dateien streng. Die Dateien, die mit der MQL5-Sprache bearbeitet werden, können sich nicht außerhalb der Datei-Sandbox" befinden.

Eine Datei wird im Client-Terminal-Ordner im Unterordner MQL5\Files (oder im Agent-Testing-Verzeichnis\MQL5\Files im Falle von Tests) geöffnet. Wenn unter den Flags FILE_COMMON angegeben ist, wird die Datei im gemeinsamen Ordner aller Client-Terminals \Terminal\Common\Files geöffnet.

Was hat das mit dem alten Terminal zu tun, wenn Sie den MQL5-Code ausführen?
Es macht keinen Unterschied, ob es sich um MQL4 oder MQL5 handelt. Der Code dieses Skripts funktioniert auf beiden Plattformen gleichermaßen. Ich habe es auf MT4 getestet.
 
Реter Konow:
Es macht keinen Unterschied, ob der Code MQL4 oder MQL5 ist. Der Code dieses Skripts funktioniert auf beiden Plattformen gleichermaßen. Ich habe es auf MT4 getestet.

Haben Sie den MQL5-Code in dem alten Terminal ausgeführt? Lassen Sie mich nachsehen ...

 
Vladimir Karputov:

Haben Sie den MQL5-Code in dem alten Terminal ausgeführt? Lassen Sie mich nachsehen ...

Glauben Sie mir, damit gibt es kein Problem.
 
Реter Konow:
Glauben Sie mir, damit gibt es kein Problem.

Was ich beweisen musste: Das alte Terminal sieht keine MQL5-Programme. Sie versuchen, die Datei-Sandbox einer anderen Person in einem MQL5-Skript zu öffnen.

 

Реter Konow:

Die Funktion FolderClean() schlägt jedoch aus irgendeinem Grund fehl, und der Ordner mit der Datei wird nicht geleert. Folglich wird er nicht durch FolderDelete() gelöscht.

Aus irgendeinem Grund lässt mich das Betriebssystem die Datei nicht löschen - vielleicht ist sie von einem anderen Programm geöffnet oder es hat keine Zugriffsrechte.

PS: Wenn man das Programm nicht protokolliert, sind andere gezwungen, aus dem Kaffeesatz zu schöpfen.