Обсуждение статьи "Работаем с ZIP-архивами средствами MQL5 без использования сторонних библиотек" - страница 7

 
Alexandr Gavrilin #:

Как с помощью данной библиотеки реализовать такую задачу бэкапа файлов:

Нужно создать архив в который раскидать по папкам

\MQL5\Experts\

\MQL5\Indicators\

\MQL5\Include\

и т.д. ?

Здесь хороший пример.

MQL5 Program Packer
MQL5 Program Packer
  • www.mql5.com
This is MQL5 project packer: assemble all source and resource files from dependencies into a single ZIP.
 
fxsaber #:

Здесь хороший пример.

Спасибо, буду изучать. Устал от периодических обновлений файлов по разным архивам клиентам. Много времени отнимает, нужна автоматизация.

 
fxsaber #:

Здесь хороший пример.

Спасибо, рабочий вариант!


Дополню.

Нельзя паковать ex5 , ex4 файлы, а мне надо именно их закидывать. 

Вот тестовый скриптик на базе предложенного накидал. mq5 закидывает без проблем, если меню разрешение ex5 то все ошибка неверное имя файла 5002.

//+------------------------------------------------------------------+
//|                                                   UpdateShop.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

// #define UNICODE_WARNING
#include <mql5/FileReader.mqh>
#include <Zip/Zip.mqh>
string sdir="MQL5/Experts/trading-shop.ru/";

string filelist[]=
  {
   "sovetnikov.net/WSO EA.mq5",
   "sovetnikov.net/SN Liza EA.mq5"
  };


CZip Zip;      // Create empty zip archive.

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int added=0;
   string listing="";
   for(int i=0; i<ArraySize(filelist); i++)
     {
      string name=sdir+filelist[i];

      CZipFile *file = new CZipFile();
      if(!file.AddFile(name)
         || !Zip.AddFile(file))
        {
         delete file;
        }
      else
        {
         added++;
         Print(" + "+name);
        }

     }

   if(added>0)
     {
      //создаем каталог

      //сохраняем в файл архив
      const string archive = "MQL5/Files/Test.zip";
      if(Zip.SaveZipToFile(archive))
        {
         Print("Packed file saved: ", archive);
        }
     }
  }
//+----------------------------------------------------------------
Очередное спасибо разработчиком за безопасность работы с файлами.... опять очередные костыли делать.
 

Здравствуйте,

есть ZIP архив в нем один CSV файл.
Как считать этот файл в строку. (Без сохранения на диск и чтения с диска)

 
Forester #:

Здравствуйте,

есть ZIP архив в нем один CSV файл.
Как считать этот файл в строку. (Без сохранения на диск и чтения с диска)

https://www.mql5.com/ru/articles/1971

Работаем с ZIP-архивами средствами MQL5 без использования сторонних библиотек
Работаем с ZIP-архивами средствами MQL5 без использования сторонних библиотек
  • www.mql5.com
Язык MQL5 развивается, и в него постоянно добавляются новые функции для работы с данными. С некоторых пор, благодаря нововведениям, стало возможно работать с ZIP-архивами штатными средствами MQL5 без привлечения сторонних библиотек DLL. Данная статья подробно описывает, как это делается, на примере описания класса CZip — универсального инструмента для чтения, создания и модификации ZIP-архивов.
 

Это ветка обсуждения указанной вами статьи. Увидел только возможность выгрузить ZIP в папку на диск. А хотелось бы сразу в строку.

 

Если кому нужно будет вот готовый скрипт для чтения архива в строку.

Архив из статьи не компилируется.  папку ZIP и Dictionary.mqh скачать тут https://www.mql5.com/en/code/27955 - они рабочие

#property copyright "Copyright 2015, Vasiliy Sokolov."
#property link      "https://www.mql5.com"
#property version   "1.00"

int is_common=1;

#include <Zip\Zip.mqh>

CZip Zip;

void OnStart(){
   string filenames[]; if(FileSelectDialog("Выберите файлы для загрузки", "CSV/", "CSV files (*.csv)|*.csv;*.zip|ZIP files (*.zip)|*.zip|All files (*.*)|*.*", FSD_ALLOW_MULTISELECT|(is_common?FSD_COMMON_FOLDER:0), filenames, "data.txt")>0){int total=ArraySize(filenames);for(int i=0; i<total; i++){Print(i, ": ", filenames[i]);}} else{Print("Files not selected");}

   bool res=Zip.LoadZipFromFile(filenames[0],FILE_COMMON);//считать 0й файл из выбранных
   if(!res) {
      uint last_error=GetLastError();
      if(last_error<ERR_USER_ERROR_FIRST){printf("Возникла системная ошибка при загрузке архива. Номер ошибки: "+(string)last_error);}
      else {  ENUM_ZIP_ERROR error=(ENUM_ZIP_ERROR)(last_error-ERR_USER_ERROR_FIRST); printf("Возникла ошибка обработки архива в момент его загрузки: "+EnumToString(error));}
      return;
   }
   
   CZipFile* content = Zip.ElementAt(0);//считать в архиве файл номер 0
   uchar file_content[];
   content.GetUnpackFile(file_content);// распаквать его в массив file_content

   string  s = CharArrayToString(file_content,0,-1,CP_UTF8);//CP_ACP
   
   string sa[];
   int k=StringSplit(s,'\n',sa);//--- разобьем строку на подстроки
   for(int i=0;i<k;i++){
      PrintFormat("result[%d]=\"%s\"",i,sa[i]);
   }
}
MQL5 Program Packer
MQL5 Program Packer
  • www.mql5.com
This is MQL5 project packer: assemble all source and resource files from dependencies into a single ZIP.
 
А вообще, хорошо бы добавить функции архивации в сам терминал. Судя по обсуждению, файлы регулярно перестают компилироваться.
 
Планируется ли добавление функции распаковки строки, сжатой алгоритмом GZIP?
 
Ivan Titov #:
Планируется ли добавление функции распаковки строки, сжатой алгоритмом GZIP?

Краткий ответ: нет, не планируется, так как это совсем другой формат не совместимый с zip. Для работы с GZip нужна отдельная, аналогичная этой, библиотека. Далее моя цитата из соседней ветки:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

WebSocket и GZIP

Vasiliy Sokolov, 2024.03.21 14:35

Стоит различать форматы хранения данных от алгоритмов сжатия.

Zip - это формат хранения нескольких файлов в одном, наподобии формата TAR. Сами файлы в формате zip обычнно сжимаются алгоритмом сжатия deflate, но могут не сжиматся им вовсе, а просто хранится в этом формате, в таком случае формат позволяет просто объединить несколько файлов в один архив (файл) без сжатия.

GZip это формат хранения сжатых данных алгоритмом deflate в одном файле.

Если Вам выдали GZip - формат zip вам не подойдет. Вам нужно знать формат gzip и распоковать его с помощью системной функции CryptEncode(CRYPT_ARCH_ZIP). Это не сложно сделать самостоятельно, без привлечения сторонних библиотек, так как алгоритм сжатия там один и тот же, deflate (в MQL он имеет не очень удачный идентификатор CRYPT_ARCH_ZIP). Жаль что нет специальной статьи "Работаем с GZip архивом средствами MQL5". В целом, это не задача системной функции, а задача специальной MQL бибилотеки, оборачивающий deflate вокруг формата gzip.


Причина обращения: