Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Bitte machen Sie weiter - solange Sie in dem faszinierenden Genre der "Fiktion" schreiben. Spätestens auf Seite 40 sind Sie hoffentlich bei der Fachliteratur angelangt.
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.
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.
Der Code muss nur vollständig sein. Wenn die Datei geöffnet ist, muss sie vor dem Herunterfahren des Computers oder dem Schließen von MT4/5 geschlossen werden. Und vorzugsweise muss der Griff von jeder Stelle des Programms aus zugänglich sein. Dies ist meine Meinung. Noch besser ist es, die Datei sofort zu schließen, nachdem Sie eine Lese-/Schreiboperation mit ihr durchgeführt haben, oder auch wenn Sie nichts mit ihr zu tun haben.
Die Beispieldokumentation scheint zu zeigen, wie man es nicht machen sollte.
Es ist auch sehr wichtig, daran zu denken, dass beim Schreiben in eine Datei die geschriebene Datei nur gelesen werden kann, indem alle im Datei-E/A-Puffer verbliebenen Daten mit FileFlush auf die Festplatte geschrieben werdenoder indem die Datei geschlossen wird. Wenn Sie die Datei schließen, werden die Daten auf die Festplatte zurückgesetzt.
Zusammenfassung: Wenn Sie eine Datei öffnen, vergessen Sie nicht, sie wieder zu schließen. Und der Datei-Handle geht nicht verloren.
Der Code muss einfach vollständig sein. Wenn eine Datei geöffnet ist, muss sie geschlossen werden, bevor der Computer ausgeschaltet oder MT4/5 geschlossen wird. Und der Griff sollte möglichst von jeder Stelle des Programms aus erreichbar sein. Dies ist IMHO. Noch besser ist es, die Datei sofort nach dem Lese-/Schreibvorgang zu schließen, auch wenn Sie nichts mit ihr zu tun hatten.
Die Beispieldokumentation scheint zu zeigen, wie man es nicht machen sollte.
Es ist auch sehr wichtig, daran zu denken, dass beim Schreiben in eine Datei die geschriebene Datei nur gelesen werden kann, indem alle im Datei-E/A-Puffer verbliebenen Daten mit FileFlush auf die Festplatte geschrieben werdenoder indem die Datei geschlossen wird. Während des Schließvorgangs werden die Daten zwangsweise auf die Festplatte zurückgesetzt.
Zusammenfassung: Wenn Sie eine Datei öffnen, vergessen Sie nicht, sie wieder zu schließen. Und der Datei-Handle geht nicht verloren.
Auch hier kann ich eine von meinem Programm erstellte Datei mit der Funktion FileClose() schließen - ich habe ihr Handle.
Ich kann eine Datei, die von einem anderen Benutzer erstellt wurde, sich aber im Ordner "Dateien" befindet, nicht schließen, weil ich keinen Zugriff darauf habe.
Wenn ich eine Datei kopiere, die nicht von mir erstellt wurde (nicht mein Programm), dann kann ich sie nach dem Kopieren nicht mit der Funktion FileClose() schließen (kein Handle), ABER ich kann sie löschen.
Vielleicht ist das der Grund, warum Ordner mit kopierten und gelöschten Dateien nicht von der Funktion FolderClean() gelöscht werden. Wahrscheinlich, weil sie nicht geschlossen wurden, nachdem sie kopiert worden waren.
ABER SIE KÖNNEN NICHT GESCHLOSSEN WERDEN, WEIL SIE KEINEN GRIFF HABEN!
:)))
Fragen an die Entwickler:
1. Wie erhalte ich den Handle der Datei, die vor dem Laden des Skripts im Ordner "Files" erstellt wurde?
2. Könnte das Problem des Löschens von Ordnern mit FolderClean(), nachdem Dateien darin gelöscht wurden, die zuvor in einen anderen Ordner kopiert und nach dem Kopieren nicht geschlossen wurden (weil es keinen Handle gibt), die oben genannte Ursache haben?
Fragen an die Entwickler:
1. Wie erhalte ich den Handle der Datei, die vor dem Laden des Skripts im Ordner "Files" erstellt wurde?
2. Könnte das Problem des Löschens von Ordnern mit der Funktion FolderClean(), nachdem Dateien darin gelöscht wurden, die zuvor in einen anderen Ordner kopiert und nach dem Kopieren nicht geschlossen wurden (weil es keinen Handle gibt), den oben genannten Grund haben?
Das sind sozusagen die Grundlagen des Betriebssystems. Wenn eine Anwendung eine Datei zum Schreiben geöffnet hat, kann weder diese Datei noch der Ordner, der sie enthält, gelöscht werden. Versuchen Sie, eine Datei in Word zu öffnen und dann mit den Werkzeugen des Betriebssystems den Ordner zu löschen, in dem sie sich befindet. Was wird geschehen? Das werden Sie nicht können, weil Sie keinen Zugang dazu haben werden.
Nun, Sie können den Datei-Handle bekommen. Aber was würde eine solche Aktion bringen? Denn wenn die Datei von einer anderen Anwendung geöffnet wird, sehen Sie die vorherige Anweisung. Wir erhalten nur ein Handle, das in unserer Anwendung gültig ist.
Das sind sozusagen die Grundlagen des Betriebssystems. Wenn eine Anwendung eine Datei zum Schreiben geöffnet hat, können weder die Datei noch der Ordner, der sie enthält, gelöscht werden. Versuchen Sie, eine Datei in Word zu öffnen und dann mit Hilfe des Betriebssystems den Ordner zu löschen, in dem sie sich befindet. Was wird geschehen? Das werden Sie nicht können, weil Sie keinen Zugang dazu haben werden.
Nun, Sie können den Datei-Handle bekommen. Aber was würde eine solche Maßnahme bringen? Denn wenn die Datei von einer anderen Anwendung geöffnet wird, sehen Sie die vorherige Anweisung. Und wir können nur einen Handle erhalten, der in unserer speziellen Anwendung gültig ist.
Die Datei wird von meiner Anwendung (Datei-Navigator) geöffnet, um in einen anderen Ordner überschrieben zu werden.
Nach dem Überschreiben muss ich die Datei schließen, kann das aber nicht (kein Handle), also lösche ich die Datei einfach.
Es gibt keinen Handle, da nicht bekannt ist, wann und von wem die Datei erstellt wurde.
Gleichzeitig existiert die Datei im Ordner "Dateien" und kann in einen anderen Ordner kopiert und dann gelöscht werden.
Nach dem Kopieren kann die Datei jedoch nicht geschlossen werden. Es gibt keinen Griff.
Dies ist wahrscheinlich der Grund, warum das weitere Löschen von Ordnern mit FolderClean() mit gelöschten Dateien nicht funktioniert.
Frage: Wie bekomme ich das Handle dieser Datei in das MQL-Programm?
Dies scheint ein Problem zu sein, mit dem die Gemeinschaft noch nicht konfrontiert wurde... :)
OK, ich werde mir etwas einfallen lassen.
Das tue ich immer.)
Entlarvung von Mythen.
Also, Terminaldaten auf dem Betriebssystem:
Zum Zeitpunkt der Tests wurde der Ordner "test" in [data folder]\MQL5\Files erstellt und darin die Textdatei "source.txt" mit folgendem Inhalt angelegt:
Schritt 1: Kopieren der Datei "source.txt" in eine andere Datei mit den MQL5-Tools
Drehbuch:
Schritt 2: Bereinigung des Ordners "test" mit MQL5-Tools
Drehbuch:
Schritt 3: Löschen des Ordners "test" mit den MQL5-Tools
Wo liegt das Problem? Alles funktioniert.
Was ist denn so schlimm daran? Alles funktioniert.
Vielen Dank für dieses Beispiel. Ich werde es morgen früh herausfinden. Ich habe im Moment nicht die Energie dafür).
Ich werde alles prüfen und Ihnen eine Antwort geben.
Hinzugefügt:
Sie haben hier drei verschiedene Skripte zitiert.
Ich habe ein Programm und das Kopieren, Löschen von Dateien und Ordnern geschieht innerhalb einer Funktion in zwei Zyklen.
Geben Sie den ersten Zyklus ein: Zuerst werden die Quelldateien in einen anderen Ordner kopiert, dann werden diese Quelldateien gelöscht. Beenden Sie den ersten Zyklus.
Wir beginnen mit der zweiten Schleife: Wir leeren den Quellordner mit FolderClean() und löschen den Quellordner mit -FolderDelete().
Dann sehen wir im Dateinavigator des Meta-Editors, dass der Quellordner teilweise gelöscht wurde. Unterordner, die keine Dateien enthielten, wurden vollständig gelöscht, und diejenigen, die einige Dateien enthielten, wurden nicht gelöscht, sondern sind leer.
Versuchen Sie, Ordner manuell zu entfernen - wir haben es geschafft:
Dann schließen wir das Terminal und starten es erneut. Wir sehen, dass einige Unterordner von selbst verschwunden sind, andere sind geblieben. Wir löschen sie manuell und ohne Probleme. Dieses Mal.