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

 
Реter Konow:

Ich meine, haben Sie einen EA aus einem Skript erstellt und versucht, ihn auszuführen?

Ich bin zu faul, um das zu überprüfen, aber wenn Sie die Flags FILE_SHARE_READ undFILE_SHARE_WRITE ausprobieren
 
A100 Und versuchen Sie FILE_COMMON überall

STARIJ Ich bin zu faul, um das zu überprüfen, aber wenn Sie die FILE_SHARE_READ- undFILE_SHARE_WRITE-Flags ausprobieren

Die Sache ist die, dass es unklar ist, was diese Flags mit FolderClean() zu tun haben. Meiner Meinung nach überhaupt nicht.

Ich möchte beweisen, dass es gar nicht um die Datei geht. Ich werde das Skript so umgestalten, dass es einen Ordner "DeleteMe.txt" anstelle des Ordners "notempty" erstellt und dann diesen Ordner löscht, genau wie es zuvor mit der Datei versucht hat. Mal sehen, ob es einen Unterschied macht).

Automated Trading and Strategy Testing
Automated Trading and Strategy Testing
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 
Реter Konow:

Die Sache ist die, dass es unklar ist, was diese Flags mit FolderClean() zu tun haben. Meiner Meinung nach überhaupt nicht.

ein Ordner kann gelöscht werden, wenn er keine Dateien enthält oder wenn er entfernt werden kann. Diese Flags erlauben den Zugriff auf die Datei

 
Реter Konow:

Ich meine, haben Sie einen EA aus einem Skript erstellt und versucht, ihn auszuführen?

Wo habe ich gesagt, dass ich einen EA gemacht habe?

 

Ich muss sagen, dass es tatsächlich funktioniert, die Datei explizit zu schließen. Ich schätze, ich habe mich geirrt. Beim ersten Mal hat es nicht funktioniert, wahrscheinlich weil ich keine neue Version des umgestalteten Skripts gespeichert habe und die explizite Schließung nicht wirksam wurde.

Jetzt habe ich versucht, Ordner statt einer Datei zu erstellen. Sie wurden ohne Probleme gelöscht.

Dann wurde die Dateierstellung wieder hinzugefügt. Ergebnis: Ohne die Datei explizit zu schließen, wird der Ordner nicht wie bisher vom Skript gelöscht. Beim expliziten Schließen der Datei wird diese vollständig gelöscht.

Natürlich erklärt diese Erfahrung nicht alles, und einige Dinge bleiben vorerst unklar, aber dieses Ergebnis ist inspirierend.

Ich werde weiter testen und über die Ergebnisse berichten.

Möglicherweise gibt es noch Probleme, und es ist schwer, das im Moment mit Sicherheit zu sagen.

 
Alexey Viktorov:

Wo habe ich gesagt, was das Ratsmitglied getan hat?

Ich entschuldige mich, ich habe das falsch verstanden.
 

Hier ist der Code des Skripts, das sowohl die Datei "DeleteMe.txt" als auch die Datei "DeleteMe Folder" erstellt. Die Datei wird sofort nach der Erstellung explizit geschlossen.

Alles scheint zu funktionieren...

//+------------------------------------------------------------------+ 
//|                                            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 FolderName="delete_me Folder";       // имя файла, который мы создадим в папке secondFolder 
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());
 
//--- теперь создадим пустую папку с помощью функции FolderCreate 
   string filepath=secondFolder+"\\"+FolderName;  // сформируем путь для файла, который хотим открыть на запись в несуществующей папке 

   if(FolderCreate(filepath)) 
     { 
      FolderCreate(filepath + "1");
      PrintFormat("Открыли папку %s",working_folder+"\\"+filepath); 
     } 
   else 
      PrintFormat("Не удалось создать папку %s в папке %s. Код ошибки=",FolderName,secondFolder, GetLastError());
 /**/
 //--- теперь создадим файл с помощью функции FileOpen() 
   string filepath_2=secondFolder+"\\"+filename;  // сформируем путь для файла, который хотим открыть на запись в несуществующей папке 
   handle=FileOpen(filepath_2,FILE_WRITE|FILE_TXT); // флаг FILE_WRITE в данном случае обязателен, см. справку к функции FileOpen 
   if(handle!=INVALID_HANDLE) 
     {
//*************************************************************************     
   //---- Явно закрываем файл.   
      FileClose(handle);
//*************************************************************************           
      PrintFormat("Открыли файл на чтение %s",working_folder+"\\"+filepath_2); 
     } 
   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("Удаление отменено"); 
//--- 
  }


 
Реter Konow:

Natürlich erklärt diese Erfahrung nicht alles, und einige Dinge bleiben bis jetzt vage, aber dieses Ergebnis ist inspirierend.

Ich werde weitere Tests durchführen und über die Ergebnisse berichten.

Es kann immer noch Probleme geben, und es ist schwer, das im Moment mit Sicherheit zu sagen.

Ja, natürlich können Sie das, und behalten Sie die Details für sich, sagen Sie einfach: "Ich habe das Beispiel aus der Hilfe geändert, überhaupt nichts".

Und wir werden weiter raten - denn mit Protokollen kann jeder raten, und das ist viel interessanter.

 
Rashid Umarov:

Ja, natürlich, schreiben Sie. Und die Details behalten Sie für sich, sagen Sie einfach: "Ich habe ein kleines Beispiel der Hilfe geändert, gar nichts.

Und wir werden weiter raten - denn bei Protokollen kann jeder raten, und das ist viel interessanter.

Seltsam. Es ist nichts Persönliches. Wenn ich unprofessionell bin, tut es mir leid. Ich werde es lernen.

Vielen Dank für Ihre Hilfe.


P.S. Ich habe noch nie im Forum um Hilfe gebeten. Daher auch die Unerfahrenheit.

 

Ich erinnere mich an Ihr "Ich habe alle Züge aufgeschrieben" im Thread OOP vs. prozedurale Programmierung. In diesem Thread war ich einfach überzeugt, dass man Ihnen nicht trauen kann.

Es gibt keine Beweise und keine Einzelheiten - es besteht keine Notwendigkeit, sich an den Kundendienst zu wenden.