Arbeiten mit Dateien. - Seite 5

 
Yedelkin:

Frage 1: Glauben Sie, dass es sich um einen Tippfehler in der Dokumentation handelt und dass statt "Letztes Lesedatum" etwas wie "Letztes Öffnungsdatum" stehen sollte?

Ja, das ist der wörtliche Wortlaut:

lpLastAccessTime [out, optional]

Ein Zeiger auf eineFILETIME-Struktur, um das Datum und die Uhrzeit des letzten Zugriffs auf die Datei oder das Verzeichnis zu erhalten. Der letzte Zugriffszeitpunkt umfasst das letzte Mal, dass in die Datei oder das Verzeichnis geschrieben, aus ihr gelesen oder - im Falle von ausführbaren Dateien - ausgeführt wurde.

Lose Übersetzung - der letzte Zugriff umfasst das letzte Mal, dass die Datei gelesen oder geschrieben oder ausgeführt wurde (wenn sie ausführbar ist).

Wahrscheinlich liege ich mit der Übersteuerung des Griffs falsch, aber es gibt auch diesen interessanten Text:

Nicht alle Dateisysteme können die Erstellungs- und die letzten Zugriffszeiten aufzeichnen, und nicht alle Dateisysteme zeichnen sie auf die gleiche Weise auf. Bei FAT zum Beispiel hat die Erstellungszeit eine Auflösung von 10 Millisekunden, die Schreibzeit eine Auflösung von 2 Sekunden und die Zugriffszeit eine Auflösung von 1 Tag (eigentlich das Zugriffsdatum). Daher kann es sein, dass die FunktionGetFileTime nicht dieselbe Dateizeitinformation zurückgibt, die mit der Funktion SetFileTime eingestellt wurde.

NTFS verzögert die Aktualisierung der letzten Zugriffszeit für eine Datei um bis zu einer Stunde nach dem letzten Zugriff. NTFS erlaubt es auch, die Aktualisierung der letzten Zugriffszeit zu deaktivieren. Die letzte Zugriffszeit wird bei NTFS-Volumes standardmäßig nicht aktualisiert.

In der gegenwärtigen Situation wird Glück erwartet, wenn Dateieigenschaften abgerufen werden, ohne dass das Handle "neu geöffnet" wird.

Offenbar kein Glück, zumindest nicht, wenn es um Sekunden geht.
 
TheXpert:

Ja, das ist der wörtliche Wortlaut:

Lose Übersetzung - der letzte Zugriff umfasst das letzte Mal, dass die Datei gelesen oder geschrieben oder ausgeführt wurde (wenn sie ausführbar ist).

Wahrscheinlich liege ich mit der Überschreibung des Griffs falsch, aber es gibt auch diesen interessanten Text:

Offensichtlich hat man nicht so viel Glück, zumindest nicht, wenn es um Sekunden geht.

Danke für die Erweiterung des Horizontes! Ja... Schade.

Dieses Skript besagt, dass der Bezeichner FILE_ACCESS_DATE anstelle von "Last read date" den Zeitpunkt des letzten Schließens der Datei zurückgibt:

int handle_file;
void OnStart()
  {
   Print("===============================================");
   handle_file=FileOpen("Ye_file2.bin",FILE_READ|FILE_WRITE|FILE_BIN);
   switch(handle_file)
     {
      case  INVALID_HANDLE: break;
      default:
         Print("Дата создания файла Ye_file2.bin: ",(datetime)FileGetInteger(handle_file,FILE_CREATE_DATE));
         for(int i=0;i<3;i++)
           {
            Sleep(2000);
            FileReadInteger(handle_file,CHAR_VALUE);
            Print("Дата последнего чтения Ye_file2.bin: ",(datetime)FileGetInteger(handle_file,FILE_ACCESS_DATE));
           }
         Sleep(3000);
         Print("Время обращения к FileClose(handle_file): ",TimeTradeServer());
         FileClose(handle_file);
     }
  }
 
TheXpert:

Aber trotz der wilden Schlussfolgerungen sind die Tests aufschlussreich, so dass wir auf die Kommentare der Entwickler warten, wie die Funktion funktioniert, wenn es keine Änderungen gibt.

Übrigens habe ich in den letzten drei Monaten keine Kommentare erhalten, so dass ichFileFlush() vorerst nicht verwende.
 

Es scheint mir, dass FileFlush das Programm nicht verlangsamen/beschleunigen sollte, wenn es anstelle von FileClose verwendet wird.

Es ist einfach nicht sinnvoll, sie in einer Schleife für jeden Datensatz zu verwenden. Stellen Sie sich vor, wie langsam Word wäre, wenn es jedes Mal, wenn ein Dokument geändert wird, neu gespeichert würde (vor allem, wenn das Dokument viel Text und Bilder enthält). FileFLush ermöglicht nur das Speichern ohne Schließen von Dateien.

Das müssen die Entwickler gemeint haben (zum Beispiel):

OnInit - FileOpen

Bei Tick - FileWrite FileFlush

(und hier werden die Daten -FileFlash- in der Schleife gespeichert, nicht bei jedem Schleifendurchlauf, sondern nachdem die Schleife beendet ist)

OnDeinit FileClose.

Der Sinn von FileFlash ist es, die ganze Zeit, in der der Expert Advisor läuft, in das FileFlash zu schreiben, damit Sie nicht ständig das Dateihandle und den mystischen Dateipuffer neu initialisieren müssen.

......niverse)

 
Yedelkin:
Übrigens habe ich in den letzten drei Monaten keine Kommentare erhalten, deshalb habe ich es vorerst vermieden, FileFlush() zu verwenden.
Eine sofortige Rettung ist ohnehin nicht garantiert. Es macht also nur Sinn, den aktuellen Zustand zu speichern, ohne den Handle zu schließen.
 
Yedelkin:
Übrigens habe ich in den letzten drei Monaten keine Kommentare erhalten, daher vermeide ich die Verwendung von FileFlush() bis auf Weiteres.

Um die Bedeutung der Funktion FileFlush() besser zu verstehen, müssen wir über das Konzept des Dateieingabe-/Ausgabepuffers nachdenken... Wie Sie wissen, werden Festplatteninformationen in Bytes gespeichert, und jedes Byte einzeln zu schreiben (sobald es eintrifft) ist der Gipfel der Verschwendung! Wenn man diesen Prozess von der "Hardware"-Seite aus betrachtet, dann müsste das Betriebssystem bei jeder Anforderung eines Byte-Schreibvorgangs den "Schreibkopf" des Festplattenlaufwerks "wackeln"! Und eine Festplatte ist kinematisch! Mit anderen Worten: Es ist das langsamste aller Computergeräte. Was ist also die Lösung? Eine sehr einfache Lösung! Im Speicher des Computers wird der Puffer der Daten (gewöhnlich einige zehn Kilobytes) geschaffen, in den die Daten von der Funktion FileWrite und ähnlich gesendet werden. Sobald dieser Puffer völlig gefüllt wird, schreibt das System sie vollständig auf die Festplatte als ein ununterbrochener Block der Daten, so wird die unnötige Manipulation des Laufwerkskopfes nicht durchgeführt, und einfach werden die Daten in EINEM LOCK geschrieben! Berechnen Sie nun, um wie viel schneller es ist, 32 Kilobyte an Informationen auf einmal zu schreiben, als jedes Byte der gleichen Größe einzeln zu schreiben ;) Und die Berechnung ist ganz einfach... Bei jedem Schreibvorgang wird zuerst der Laufwerkskopf positioniert, dann wird der Schreibvorgang durchgeführt. Und das, ohne auf die ganze harte Arbeit einer Lese-/Schreiboperation einzugehen :) Im Falle eines Puffers positionieren wir den Laufwerkskopf einmal und schreiben den gesamten Block in einem Strom!

Aber bis der Puffer voll ist, werden die Daten nicht in der Datei erscheinen (!!!), oder bis Sie die Datei selbst schließen, in welchem Fall der Puffer (oder besser gesagt, was darin übrig ist) sofort auf die Festplatte geschrieben wird. Hier kommt die FileFlush-Funktion ins Spiel. Wenn Sie einige Informationen in die Datei "geschrieben" haben und diese in der Datei erscheinen müssen (zum Beispiel können diese Informationen bereits von einem anderen Programm, Indikator, Expert Advisor... verwendet werden), dann können Sie die Funktion FileFlush aufrufen, die den Inhalt des Puffers physisch auf die Festplatte (in eine Datei) ausgibt!

Fazit: Die häufige Verwendung der FileFlush-Funktion oder ihre Verwendung in Schleifen, um die Arbeit mit der Datei zu beschleunigen, führt genau zum gegenteiligen Ergebnis, da das System bei jedem Aufruf die Menge der tatsächlich im E/A-Puffer enthaltenen Informationen berechnen, das Betriebssystem aufrufen und den Befehl zum Schreiben dieses Speicherbereichs in die Datei geben muss! Schreibt die Schleife z.B. ein Byte in die Datei und ruft sofort die FileFlush-Funktion auf, erhalten wir die langsamste Art, auf die Festplatte zu schreiben HINTERGRUND!!! ;)

Wie kann man also am schnellsten in eine Datei schreiben? Ganz einfach ;) Machen Sie nicht rum und quälen Sie FileFlush :) In diesem Fall erfolgt ein schneller Datenaustausch zwischen FileWrite und der Zwischenablage (die Speichermanipulation ist am schnellsten). Das System achtet auf einen Überlauf in diesem Puffer und streamt gegebenenfalls Daten (die schnellste Operation bei einem so schwerfälligen Gerät wie einer Festplatte!) und löscht den Puffer, um neue Daten zu empfangen!!!

Dann stellt sich die Frage: "Warum brauchen Sie die FileFlush-Funktion?". Die Antwort ist einfach: Sie wird benötigt, wenn die Daten physisch in die Datei geschrieben werden müssen, unabhängig davon, ob der Puffer gefüllt ist. Ich habe oben ein Beispiel für eine solche Notwendigkeit gegeben.

Документация по MQL5: Файловые операции / FileFlush
Документация по MQL5: Файловые операции / FileFlush
  • www.mql5.com
Файловые операции / FileFlush - Документация по MQL5
 

Ich musste meinen Indikator für MQL5 umschreiben und stieß auf einige ernsthafte Verwirrung :(

Hier ist der Code:

  first_bar=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
  
  //--- установим доступ к массиву как к таймсерии
  ResetLastError();
  int copied=CopyTime(NULL,0,0,first_bar,TimeAsSeries);
  del();
  int handle=FileOpen("Price Label\\"+_Symbol+tpl_ext,FILE_READ|FILE_CSV,';',CP_ACP);
  int er=GetLastError();
  ResetLastError();
  
  string sTF="";
  int TF;
  string period_name;
  string price_label;
  string price1;
  string price2;
  
  if (handle>=1){
    while(FileIsEnding(handle)==false){
      sTF = FileReadString(handle);
      TF = ResolveTF(sTF);
      period_name=FileReadString(handle);
      price_label=FileReadString(handle);
      price1=FileReadString(handle);
      price2=FileReadString(handle);
      drawe_price(TF,handle,period_name,price_label,price1,price2);
    }
    FileClose(handle);
  }
  return(0);

Ich möchte gleich erklären, dass ich eine so große Anzahl von Variablen eingegeben habe, um zu sehen, was im Debugger vor sich geht. Und ich sah...

Die Datei enthält eine Reihe von Zeichenfolgen, wobei jede Zeichenfolge aus 5 Abschnitten besteht, die durch ";" getrennt sind. Der erste Anruf

sTF = FileReadString(handle);

legt die gesamte Datei in einer unverständlichen Kodierung in die Variable sTF. Nach dem zu urteilen, was ich im Debugger sehe (in der sTF-Variable wird der Dateiinhalt als Unicode gelesen! Beim Öffnen der Datei habe ich alle verfügbaren Codepages ausprobiert, aber das Ergebnis ist das gleiche :( Die Datei selbst ist in Windows-Kodierung geschrieben.

Hat jemand eine Idee, wo das Problem liegt?

Документация по MQL5: Файловые операции / FileOpen
Документация по MQL5: Файловые операции / FileOpen
  • www.mql5.com
Файловые операции / FileOpen - Документация по MQL5
 

is_vale

Ich danke Ihnen allen für die Weitergabe der Informationen! Ich werde mich erneut mit dem Thema befassen.

 
FILE_ANSI
 
is_vale:

Hat jemand eine Idee, wo das Problem liegt?

Ich habe schon lange nicht mehr mit Dateioperationen gearbeitet... Sehen Sie, wenn Sie FileOpen() verwenden, haben Sie eine CSV-Datei deklariert. Damit wurde festgelegt, dass alle geschriebenen Elemente in Unicode oder Ansi-Strings umgewandelt werden. Vielleicht ist der Hund hier?