Diskussion zum Artikel "Die Arbeit mit ZIP-Archiven in MQL5 ohne Bibliotheken von Drittanbietern" - Seite 5

 
Guten Tag, Vasily! Die Situation ist wie folgt: Ich lade ein Buch mit Auftragspositionen von OANDA herunter, sie kommen gepackt in API v.2 an, wenn ich versuche, sie mit CZip zu entpacken, erhalte ich die folgende Meldung: "Es gab einen Fehler bei der Archivverarbeitung im Moment des Ladens: ZIP_ERROR_BAD_FORMAT_ZIP". Ich weiß nicht genau, was darin gepackt ist, aber WinZip entpackt die empfangene Datei. Die Dateien sind nur für den Fall angehängt.
Dateien:
oanda_data.txt  85 kb
 
Die Archivdatei konnte nicht angehängt werden. Wenn Sie sie benötigen, sende ich sie Ihnen per E-Mail zu.
 
Ich habe das Zip-Archiv heruntergeladen, es sind mehrere Dateien darin enthalten. Ich versuche, sie zu entpacken, aber nichts funktioniert. Ich schaue mir den Code an und stoße auf dieses Fragment:
//+------------------------------------------------------------------+
//|| Entpacken Sie den aktuellen Zip-Inhalt und speichern Sie ihn als Datei auf der Festplatte.
//+------------------------------------------------------------------+
bool CZipContent::UnpackOnDisk(string folder, int file_common)
{
   return false;   
}


Ich verstehe, dass das Entpacken nicht funktioniert?
 
Alexey Oreshkin:
Ich schaue mir den Code an und komme zu diesem Fragment:

d.h. ich verstehe richtig, dass das Entpacken nicht funktioniert?

Schauen Sie sich den Code im Debug-Modus an, und Sie werden zum richtigen Fragment kommen. Das Entpacken funktioniert - ich benutze es jeden Tag.

 
Alexey Oreshkin:
Ich habe die Zip-Datei heruntergeladen, es sind mehrere Dateien im Archiv. Ich versuche zu entpacken und nichts funktioniert.Ich schaue mir den Code an und komme zu diesem Fragment:
also verstehe ich richtig, dass das Entpacken nicht funktioniert?

Nein, das tut es nicht. Sehen Sie genau hin, UnpackOnDisk ist eine virtuelle Methode. Sie hat keine Implementierung in der abstrakten Klasse Content. Leider erlaubt es MQL nicht, virtuelle Methoden ohne Implementierung zu erstellen, so dass Sie Stopper wie den, den Sie gefunden haben, einbauen müssen. Die eigentliche Arbeit des Speicherns einer Datei auf der Festplatte wird von CZipFile::UnpackOnDisk und CZipDirectory::UnpackOnDisk erledigt. Der Grund dafür ist, dass das Erstellen eines Verzeichnisses und einer Datei auf der Festplatte unterschiedliche Vorgänge sind und daher mit unterschiedlichen Methoden durchgeführt werden.

 
M24:
Die Archivdatei konnte nicht angehängt werden, wenn Sie sie brauchen, schicke ich sie Ihnen per E-Mail.

Das ist eigentlich das Wichtigste. Vergewissern Sie sich zunächst, dass Sie die neueste Version von CZip verwenden und versuchen Sie erneut zu entpacken.

 
fxsaber:

Schauen Sie sich den Code im Debug-Modus an, dann werden Sie das nötige Stück finden. Das Entpacken funktioniert - ich benutze es jeden Tag.

Was mache ich dann falsch? Hier ist mein Code:

   Zip.LoadZipFromFile("info.zip",FILE_COMMON);
   Zip.UnpackZipArchive("",FILE_COMMON);

Ich erwarte, dass alles im öffentlichen Ordner entpackt wird, aber er ist leer. Ich brauche nichts anderes. Im öffentlichen Ordner befindet sich die Datei info.zip.

 
Alexey Oreshkin:

Was mache ich dann falsch? Hier ist mein Code:

Ich erwarte, dass alles im öffentlichen Ordner entpackt wird, aber er ist leer. Ich brauche nichts anderes. Im öffentlichen Ordner befindet sich info.zip.

Sie müssen den Ordner angeben, denn doppelte Anführungszeichen führen zu einem Fehler.

 
fxsaber:

Sie müssen einen Ordner angeben, da doppelte Anführungszeichen zu einem Fehler führen.

Ehrlich gesagt, hat sich nichts geändert:

   Zip.LoadZipFromFile("info.zip",FILE_COMMON);
   Zip.UnpackZipArchive("Test",FILE_COMMON);

Das Ergebnis ist ebenfalls null.


p.s. Ich habe ein Beispiel aus dem Artikel genommen

   string cookie,headers;
   string mql_url="https://www.mql5.com/de/code/download/9";
   int timeout=5000;
   uchar data[],zip_array[];
   if(!WebRequest("GET",mql_url,cookie,NULL,timeout,data,0,zip_array,headers))
     {
      printf("Unable to download ZIP archive from "+mql_url+". Check request and permissions EA.");
      return;
     }
   if(!Zip.CreateFromCharArray(zip_array))
     {
      printf("Loaded bad ZIP archive. Check results array.");
      return;
     }
   printf("Archive successfully loaded. Total files: "+(string)Zip.TotalElements());
   Zip.UnpackZipArchive("Alligator",FILE_COMMON);

Ich habe die URL geändert (in den Terminaleinstellungen habe ich den Zugriff erlaubt) und das ist alles, das Ergebnis ist auch null. Ich dachte, ich würde den Parser von Sharp hierher übertragen, aber wohl nicht. So viel Aufwand, nur um die Datei zu entpacken und nichts (

 
Alexey Oreshkin:

Ehrlich gesagt, hat sich nichts geändert:

Das Ergebnis ist ebenfalls gleich null.

#include <Zip\Zip.mqh> // https://www.mql5.com/de/articles/1971

void OnStart()
{
  CZip Zip;

  Zip.LoadZipFromFile("Test.zip", FILE_COMMON);
  Zip.UnpackZipArchive("Temp", FILE_COMMON);
}
Dateien:
Test.zip  151 kb