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

 
Rashid Umarov:

Aus irgendeinem Grund lässt das Betriebssystem das Löschen der Datei nicht zu - entweder wird sie von einem anderen Programm geöffnet, oder sie ist nicht ausreichend autorisiert.

Und zwar genau so. Wenn ich versuche, einen Ordner zu löschen, der bereits Unterordner und Dateien enthält, lösche ich zuerst die Dateien. Nur die Unterordner bleiben erhalten. Ich versuche, sie mit FolderClean() zu bereinigen und rufe dann FolderDelete() auf. Das Ergebnis ist jedoch, dass die leeren Unterordner zwar gelöscht werden, aber wenn sich innerhalb der Unterordner weitere Unterordner befanden, werden diese nicht gelöscht. Danach versuche ich, die Ordner manuell aus dem Dateinavigator in MetaEditor zu entfernen, aber das Terminal entfernt sie nicht und zeigt dieses Fenster an:

Ich klicke auf "Weiter", stimme den Änderungen zu, aber der Ordner wird immer noch nicht gelöscht. Nach dem vollständigen Schließen und erneuten Öffnen des Terminals verschwinden die Ordner, die gelöscht werden sollten, entweder von selbst oder nicht, aber Sie können sie sofort und manuell ohne das obige Fenster löschen.

Solche Merkwürdigkeiten...

 
Vladimir Karputov:

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

Die Funktionen arbeiten auf beiden Terminals identisch. Es wird die Datei-Sandbox des Terminals verwendet, auf dem das Skript ausgeführt wird. Dies sind native Dateien des verwendeten Terminals. Glauben Sie mir, das ist definitiv nicht das Problem...
 
Rashid Umarov:


PS Und generell - das Programm nicht zu protokollieren, bedeutet, andere zu zwingen, aus dem Kaffeesatz zu schöpfen

Sehen Sie sich dieses Gif an:



Den Code für dieses Skript habe ich oben, auf der vorherigen Seite, angegeben.

 

Ich sollte hinzufügen, dass die Ordner, die ich zuerst per Software und dann manuell zu löschen versuche, nirgendwo geöffnet sind. Außerdem können sie nirgendwo anders als im Datei-Navigator von MetaEditor geöffnet werden, da sie leer sind und die darin enthaltenen Dateien zuvor gelöscht wurden. Die gelöschten Dateien wurden auch nirgends geöffnet.

Das Fenster, das um die Zustimmung des Administrators zum manuellen Löschen von Ordnern im Datei-Navigator in MetaEditor bittet, erscheint nur, wenn versucht wird, die Ordner zu löschen, die das Programm zuvor mit FolderClean() und FolderDelete() zu löschen versucht hat. Dieses Fenster erscheint nie, wenn Sie versuchen, andere Ordner zu löschen.

 
Реter Konow:

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

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

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

Darf ich fragen, warum es keinen Dateischluss gibt? Oder sehe ich das nur nicht?

Hier ein Ausschnitt aus Ihrem Code vom Öffnen der Datei bis zur Aufforderung zum Löschen...

   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:

Darf ich fragen, warum die Akte nicht geschlossen wird? Oder sehe ich das nur nicht?

Hier ist ein Ausschnitt aus Ihrem Code vom Öffnen der Datei bis zur Frage nach dem Löschen...

Soweit ich weiß, ist es nicht notwendig, die Datei zu schließen, wenn keine Änderungen mit Hilfe von Dateifunktionen (z. B. FileWrite()) an der Datei vorgenommen wurden. Die Funktion FileOpen() legt lediglich eine neue Datei an, und dieser Vorgang erfordert nicht das Schließen der Datei (auch in der Dokumentation zu dieser Funktion steht nicht, dass die Datei nach der Erstellung geschlossen werden sollte). Außerdem stammt dieses Skript aus der Dokumentation und ich habe dort nichts geändert. Ich habe gerade Zeilen mit der Funktion FolderClean() hinzugefügt.
 
Реter Konow:
Soweit ich weiß, ist es nicht notwendig, die Datei zu schließen, wenn keine Änderungen mit FileWrite() vorgenommen wurden. Mit der Funktion FileOpen() wird einfach eine neue Datei angelegt, und diese Operation erfordert nicht das Schließen der Datei. Außerdem stammt dieses Skript aus der Dokumentation und ich habe dort nichts geändert. Ich habe gerade Zeilen mit der Funktion FolderClean() hinzugefügt.

Wenn Sie jedoch den Code mit dem Debugger durchsehen, werden Sie feststellen, dass unmittelbar nach der Ausführung von FileOpen() eine Datei mit einer Größe von Null auf der Festplatte vorhanden ist. Und es gibt ziemlich viele Fehler und Ungenauigkeiten in der Dokumentation.

 
Alexey Viktorov:

Aber wenn Sie den Code mit dem Debugger durchgehen, befindet sich direkt nach der Ausführung von FileOpen() eine Datei mit der Größe Null auf der Festplatte. Und es gibt ziemlich viele Fehler und Ungenauigkeiten in der Dokumentation.

Für dieses Beispiel sollte die Größe also Null sein.

Ich werde nun versuchen, die Datei im Skript explizit zu schließen und es erneut versuchen.

 
Реter Konow:

Für dieses Beispiel sollte die Größe also Null sein.

Ich werde versuchen, die Datei im Skript explizit zu schließen und es dann erneut versuchen.

Ich schaue mir selten Beispielcodes an und habe den Ordner ohne Probleme gelöscht. Ich bin mir also zu 99 % sicher, dass das das Problem ist.
 

Das Ergebnis ist das gleiche.

Hier ist der neue Code:

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