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

 
Rashid Umarov:

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, an die Dienststelle zu schreiben.


Mein Problem mit dem Löschen von Ordnern ist immer noch ungelöst. Das Skript funktioniert, aber ich habe die Ursache für mein Problem noch nicht gefunden.


Es gibt alle möglichen Möglichkeiten. Das kann meine Schuld sein, muss es aber nicht. Ich bin immer bereit, die zur Lösung des Problems erforderlichen Informationen zu liefern.


Mein Feedback an servicedek ist keineswegs eine Beschwerde.

 
Rashid Umarov:

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.

Ich weiß nicht, von welchen Zügen Sie sprechen und warum Sie glauben, dass man mir nicht trauen kann. Vielleicht habe ich einen Grund dafür genannt, aber ich weiß nicht mehr genau, wo und wann.

Auf jeden Fall danke ich Ihnen, dass Sie Ihre Haltung mir gegenüber so offen dargelegt haben. Es ist besser zu wissen als nichts zu wissen.

 

Ich hoffe, Sie haben wirklich verstanden, dass Sie eine großartige Arbeit geleistet haben: Harmful Advice - how not to write to Service Desk

 
Rashid Umarov:

Ich hoffe, Sie haben es wirklich verstanden, denn Sie haben eine großartige Arbeit geleistet: Harmful Advice - how not to write to Service Desk


Leider habe ich es nicht verstanden. Ich habe versucht, meine Botschaft so klar und konkret wie möglich zu formulieren. Ich habe Details genannt, eine Gif-Datei angegeben und den Code des Skripts kommentiert. Was genau habe ich also falsch gemacht?

 

Können Sie wirklich nicht die Hilfe lesen und den Code richtig ändern? Wie können Sie dann eine andere Haltung fordern? Hier ist der Code aus der Hilfe, wobei die Ergänzungen gelb hervorgehoben sind

//+------------------------------------------------------------------+
//|                                                Test_FileOpen.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- неправильный способ открытия файла
   string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);
   string filename=terminal_data_path+"\\MQL5\\Files\\"+"fractals.csv";
   int filehandle=FileOpen(filename,FILE_WRITE|FILE_CSV);
   if(filehandle<0)
     {
      Print("Неудачная попытка открыть файл по абсолютному пути");
      Print("Код ошибки ",GetLastError());
     }
//--- правильный способ работы в "файловой песочнице"
   ResetLastError();
   filehandle=FileOpen("fractals.csv",FILE_WRITE|FILE_CSV);
   if(filehandle!=INVALID_HANDLE)
     {
      FileWrite(filehandle,TimeCurrent(),Symbol(),EnumToString(_Period));
      FileClose(filehandle);
      Print("FileOpen OK");
     }
   else Print("Операция FileOpen неудачна, ошибка ",GetLastError());

//--- еще один пример с созданием вложенной директории в MQL5\Files\
   string subfolder="Research";
   filehandle=FileOpen(subfolder+"\\fractals.txt",FILE_WRITE|FILE_CSV);
   if(filehandle!=INVALID_HANDLE)
     {
      FileWrite(filehandle,TimeCurrent(),Symbol(),EnumToString(_Period));
      FileClose(filehandle);
      Print("Файл должен быть создан в папке "+terminal_data_path+"\\"+subfolder);
     }
   else Print("Операция FileOpen неудачна, ошибка ",GetLastError());
//---
   Print("Очищаем папку \\MQL5\\",subfolder);
   FolderClean(subfolder,1);

   Print("Удаляем папку \\MQL5\\",subfolder);
   if(!FolderDelete(subfolder,1))
      PrintFormat("Ошибка! Не удалось удалить папку  \\MQL5\\",subfolder);
  }
//+------------------------------------------------------------------+
 
Rashid Umarov:

Sind Sie wirklich nicht in der Lage, die Hilfe zu lesen und den Code richtig zu ändern? Wie kann man eine andere Einstellung verlangen? Hier ist der Code aus der Hilfe, mit den Ergänzungen in gelb

Wenn die Einstellung zu meiner Person davon abhängt, ob ich einen Fehler im Code gemacht habe, dann fürchte ich, dass hier etwas nicht stimmt...))

Ich verstehe Ihre Behauptungen immer noch nicht ganz.

Ich habe meinen geänderten Code mehr als einmal im Forum veröffentlicht. Mein einziger Fehler war, dass ich nach dem Hinzufügen der expliziten Dateischließung vergessen habe, das Skript erneut zu speichern, und daher nicht gesehen habe, dass das Problem in dem von mir geänderten Skript gelöst wurde. In der Dokumentation steht jedoch nicht ausdrücklich, dass Sie die Dateien nach der Erstellung schließen müssen.

Darüber hinaus blieb, wie gesagt, mein Problem mit dem Löschen von Ordnern (wohlgemerkt nicht von Dateien) bestehen. In den Ordnern befinden sich keine Dateien mehr, aber die Funktion FolderClean löscht sie.

Die Ursache ist noch nicht geklärt.

Vielleicht bin ich also doch aus einem bestimmten Grund zum Service Desk gegangen.

Danke, dass Sie sich so viel Zeit für mein Problem genommen haben)).

 
Реter Konow:
Danke. Ich bin froh, dass ich nicht der Einzige bin, der dieses Problem hat. Ich muss dieses Problem lösen (ich kann den Dateinavigator nicht mehr ohne ihn verwenden). Ich habe an Servicedeck geschrieben. Aber ich schreibe auch hier, nur für den Fall. Es hat sich herausgestellt, dass es nicht umsonst war).
fxsaber:

Ich habe so etwas schon oft erlebt. Ich habe festgestellt, dass der Ordner "Dateien" mit allen Unterordnern und Dateien irgendwann das Attribut "schreibgeschützt" erhält. Die manuelle Deaktivierung dieser Markierung hilft nicht. Aber ein Neustart des Terminals hilft immer. Ich konnte es nicht abspielen (habe es nicht versucht), also habe ich es nicht an SD gemeldet.

Beitritt. Ich hatte seit Anfang 2014 extrem seltene Abstürze, die bei 9 Versuchen, eine Datei in diesem Ordner zu erstellen, in 16-Millisekunden-Schritten hintereinander einen OS-Fehler "32 Sharing violation" erzeugten. Ich konnte nicht herausfinden, was los war. Ich schob es auf die "radikale Aufrüstung der Dateiverarbeitungsfunktionen", die zu dieser Zeit in MQ stattfand. Ich kann es auch nicht reproduzieren, aber zufällig gab es diese Störung um 20:12:42 Uhr. Sofort, nach ein paar Sekunden, ging ich zu einer Datei in diesem Ordner, konnte sie korrekt bearbeiten und speichern. Versagen nicht erkannt.

Davor stürzte ich 5 Jahre lang ein- bis zweimal im Monat ab, seit Februar 2014 muss es jede Woche passieren, ich weiß nicht mehr, wie oft. Obwohl die Zahl der gleichzeitig laufenden Terminals von 40-50 auf 35 zurückging.

 
Vladimir:

Begleitend. Ich hatte seit Anfang 2014 einen zuvor extrem seltenen Fehler, der bei 9 Versuchen, eine Datei in diesem Ordner zu erstellen, in 16-Millisekunden-Schritten hintereinander einen OS-Fehler "32-Freigabeverletzung" erzeugte. Ich konnte nicht herausfinden, was los war. Ich schob es auf die "radikale Aufrüstung der Dateiverarbeitungsfunktionen", die zu dieser Zeit in MQ stattfand. Ich kann es auch nicht reproduzieren, aber zufällig gab es diese Störung um 20:12:42 Uhr. Sofort, nach ein paar Sekunden, ging ich zu einer Datei in diesem Ordner, konnte sie korrekt bearbeiten und speichern. Die Störung wird nicht behoben.

Davor trat dieser Absturz 5 Jahre lang ein- oder zweimal pro Monat auf, aber seit Februar 2014 ist er ununterbrochen jede Woche, ich kann nicht mehr zählen, wie oft. Obwohl die Zahl der gleichzeitig laufenden Terminals von 40-50 auf 35 zurückging.

Ich habe alle Dateien gelöscht, auch ohne sie explizit zu schließen. Gelöscht, weil ich sie nicht erstellt habe und sie sich vorher im Ordner "Dateien" befanden.

Um eine Datei zu löschen, brauchen wir nämlich ihr Handle. Wenn wir die Datei jedoch nicht erstellt, sondern nur im Ordner Files abgelegt haben, können wir ihr Handle nicht abrufen und sie daher auch nicht mit FileClose() schließen.

Gleichzeitig können wir sie aber immer noch kopieren oder löschen. Allerdings kann der Ordner danach weder programmatisch noch manuell gelöscht werden. Manuell nur nach einem Neustart des Terminals.

Ich werde später versuchen, das Problem anhand von Beispielen deutlicher darzustellen.

 
Реter Konow:

Alle Dateien werden gelöscht, auch wenn sie nicht explizit geschlossen werden. Gelöscht, weil ich sie nicht erstellt habe und sie sich vorher im Ordner "Dateien" befanden.

Der Punkt ist, dass wir zum Löschen einer Datei deren Handle benötigen. Wenn wir diese Datei jedoch nicht erstellt, sondern nur in den Ordner "Dateien" gelegt haben, können wir ihr Handle nicht erhalten und sie daher auch nicht mit FileClose() schließen.

Gleichzeitig können wir sie aber immer noch kopieren oder löschen. Allerdings kann der Ordner danach weder programmatisch noch manuell gelöscht werden. Manuell nur nach einem Neustart des Terminals.

Ich werde später versuchen, das Problem anhand von Beispielen deutlicher darzustellen.

Dies ist wahrscheinlich der Kern des Problems.

Wenn ich einen Ordner im benutzerdefinierten Dateinavigator umbenenne, kann ich FolderRename() nicht verwenden, weil es nicht existiert.

Stattdessen kopiere ich alle Dateien und Ordner in einen neuen Ordner mit einem benutzerdefinierten Namen und lösche die Originaldateien und -ordner aus dem ursprünglichen Ordner (den ich umbenenne). Daher lösche ich zunächst alle Dateien aus dem ursprünglichen Ordner (nachdem ich sie in den neuen Ordner kopiert habe) und verwende dann FolderClean(), um zu versuchen, die verbleibende Ordnerhierarchie im ursprünglichen Ordner zu entfernen, der bereits leer ist. An dieser Stelle tritt der Fehler auf. Einige Ordner werden gelöscht, aber ein oder zwei Ordner bleiben erhalten, genau wie der Quellordner. Danach versuche ich, sie manuell zu löschen, was nicht gelingt. Nur ein Neustart des Terminals hilft.

 
Реter Konow:

Dies ist wahrscheinlich der Kern des Problems.

Wenn ich einen Ordner im benutzerdefinierten Dateinavigator umbenenne, kann ich FolderRename() nicht verwenden, weil es nicht existiert.

Stattdessen kopiere ich alle Dateien und Ordner in einen neuen Ordner mit einem benutzerdefinierten Namen und lösche die Originaldateien und -ordner aus dem ursprünglichen Ordner (den ich umbenenne). Daher lösche ich zunächst alle Dateien im ursprünglichen Ordner (nachdem ich sie in den neuen Ordner kopiert habe) und verwende dann FolderClean(), um zu versuchen, die verbleibende Ordnerhierarchie im ursprünglichen Ordner zu entfernen, der bereits leer ist. An dieser Stelle tritt der Fehler auf. Einige Ordner werden gelöscht, aber ein oder zwei Ordner bleiben erhalten, genau wie der Quellordner. Danach versuche ich, sie manuell zu löschen, was nicht gelingt. Nur ein Neustart des Terminals hilft.


Bitte machen Sie weiter - solange Sie in dem faszinierenden Genre der "Fiktion" schreiben. Hoffentlich sind Sie spätestens auf Seite 40 zum Genre "Fachliteratur" übergegangen.

Grund der Beschwerde: