Diskussion zum Artikel "MQL5 Grundlagen der Programmierung: Dateien" - Seite 2

 
Artyom Trishkin:

Nur in der mql5-Hilfe gibt es noch kein Wort darüber....

Wird es sie für 4 geben?

FileSave ist bereits seit dem 14. Dezember in der Hilfe enthalten .

Sie können manuell auf der Website aktualisieren

 
Andrey F. Zelinsky:

Eine kleine Anmerkung zur Verständlichkeit des Hinweises.

Die Position des Verweises war nicht sofort klar (hier liegt eine offensichtliche Untertreibung vor):

Sie sollten die Hilfe lesen, bevor Sie wie üblich Kritik üben. Wenn das Beispiel nicht hilft, dann ist jeder Verweis machtlos

void OnStart()
  {
   string  filename=_Symbol+"_ticks.bin";
   MqlTick ticks[];
//---
   int copied=CopyTicks(_Symbol,ticks,COPY_TICKS_ALL,0,ticks_to_save);
   if(copied!=-1)
     {
      PrintFormat(" CopyTicks(%s) copied %d ticks",_Symbol,copied);
      //--- wenn der Tickverlauf synchronisiert ist, ist der Fehlercode Null
      if(!GetLastError()==0)
         PrintFormat("%s: Ticks are not synchronized, error=%d",_Symbol,copied,_LastError);
      //--- Schreiben der Ticks in die Datei
      if(!FileSave(filename,ticks,FILE_COMMON))
         PrintFormat("FileSave() failed, error=%d",GetLastError());
     }
 
Andrey F. Zelinsky:

Wenn Sie wollen, kann ich gar nichts schreiben, außer Bewunderung. Wenn ich anfange zu bewundern, werden Sie sagen, ich sei sarkastisch und so weiter. Ich kann nicht erfreut sein.

Wenn Sie den Ausdruck verstehen:


Ich verstehe

intcommon_flag=0// Dateiflag, werden Dateien standardmäßig in den Ordner <Datenkatalog>\MQL5\Files\ geschrieben.

 
Artyom Trishkin:

Nur in der mql5-Hilfe gibt es noch kein Wort darüber....

Wird es sie für 4 geben?

Leider wird in der vierten Version nichts verfügbar sein.
 
Lassen Sie uns eine nützliche Funktion schreiben, um eine Liste von Dateien und Ordnern zu erhalten

Leider liefert die Funktion keine vollständige Liste (einschließlich aller Unterordner und Dateien darin). Deshalb füge ich sie hinzu

string GetDirectory( const string FileName )
{
  int Pos = StringFind(FileName, "\\");
  int LastPos = Pos;
  
  while (Pos >= 0)
  {
    LastPos = Pos;
    
    Pos = StringFind(FileName, "\\", Pos + 1);
  }

  return((LastPos >= 0) ? StringSubstr(FileName, 0, LastPos + 1) : "");
}

// Gibt die Liste aller Dateien nach Filter zurück
int GetFileNames( string &FileNames[], int Pos = 0, string Filter = "*", const int Common_Flag = 0 )
{
  string FileName;
  const long handle = FileFindFirst(Filter, FileName, Common_Flag);

  if (handle != INVALID_HANDLE)
  {    
    const string Directory = GetDirectory(Filter);    
    Filter = StringSubstr(Filter, StringLen(Directory));
    
    do
    {
      const string TmpFileName = Directory + FileName;
      
      ArrayResize(FileNames, Pos + 1);      
      FileNames[Pos] = TmpFileName;      
      Pos++;
        
      if (!FileIsExist(TmpFileName, Common_Flag))
        Pos = GetFileNames(FileNames, Pos, TmpFileName + Filter, Common_Flag);
    }
    while (FileFindNext(handle, FileName));  
    
    FileFindClose(handle);
  }
  
  return(Pos);
}

Die Bedeutung des Filters ist die gleiche wie in diesem Artikel. Beispiel einer Anwendung

// Protokolliert die gesamte Sandbox-Struktur
void OnStart()
{
  string FileNames[];
  
  const int Amount = GetFileNames(FileNames);
  
  for (int i = 0; i < Amount; i++)
    Print(FileNames[i]);
}
 

An einem Ort und zum Thema

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Merkmale der Sprache mql5, Feinheiten und Techniken der Arbeit

fxsaber, 2017.08.15 17:30

// Verschieben eines Ordners. Die Beschreibung ist die gleiche wie bei FileMove - https://www.mql5.com/de/docs/files/filemove
bool FolderMove( const string FolderNameSrc, const string FolderNameDst, const int Common_Flag = 0, const int Mode_Flags = FILE_REWRITE )
{
  if (FolderNameSrc == FolderNameDst)
    return(false);

  string FileName;
  const long handle = ::FileFindFirst(FolderNameSrc + "\\*", FileName, Common_Flag);

  bool Res = false;

  if (handle != INVALID_HANDLE)
  {
    do
    {
      const string TmpFileNameSrc = FolderNameSrc + "\\" + FileName;
      const string TmpFileNameDst = FolderNameDst + "\\" + FileName;

      if (::FileIsExist(TmpFileNameSrc, Common_Flag))
        Res = ::FileMove(TmpFileNameSrc, Common_Flag, TmpFileNameDst, Mode_Flags);
      else
      {
        const string TmpFileNameSrc2 = ::StringSubstr(TmpFileNameSrc, 0, ::StringLen(TmpFileNameSrc) - 1);
        const string TmpFileNameDst2 = ::StringSubstr(TmpFileNameDst, 0, ::StringLen(TmpFileNameDst) - 1);

        if (!FolderMove(TmpFileNameSrc2, TmpFileNameDst2, Common_Flag, Mode_Flags))
          Res = ::FolderCreate(TmpFileNameDst2, Mode_Flags & FILE_COMMON);
      }
    }
    while (::FileFindNext(handle, FileName));

    ::FileFindClose(handle);
  }

  return(::FolderDelete(FolderNameSrc, Common_Flag) && Res);
}
 

dieser Artikel ist großartig, vielen Dank für die Informationen.

 

In dem Artikel ist ein Tippfehler enthalten. In der Beschreibung der Funktion "Einlesen einer Datei mit Trennzeichen in ein Array" wird die Beschreibung der Struktur:

struct SLine{
   string line[];
};

und in sollte sein (und im Skript so):

struct SLine{
   string field[];
};
 

А как можно уменшить размер файла? Примерно имею какой то BIN файл в которой поддерживаю какие то данни, потом делаю дефрагмент файла и наконец хочу умешнит его длина, потому что сзади уже есть лишное пространство. Wie bitte? Нужна какая та функция типа FileResize(int newSize).

 
Ein riesengroßes menschliches DANKESCHÖN für den Artikel, insbesondere für #property tester_file, ohne den ich es nicht geschafft hätte und lange mit dem Kopf gegen die Wand gerannt wäre.