文章 "单纯使用 MQL5 语言处理 ZIP 档案" - 页 2

 
Vasiliy Sokolov:

臭名昭著的结构铸造是脏话。将更正后的版本保留在附件中。


提示!非常感谢!

 
Vasiliy Sokolov:

现在我仔细查看了你的错误--结构铸造的情况相同,但在另一个容器中--CDictionary。将 Include\Dictionary.mqh 替换为下面附带的变体。

是的,在 MT4 下一切运行正常,我还要再说一句,CZip 是我在 MT4 上项目的主力。


剩下的就是

'm_array' - structures containing objects are not allowed Dictionary.mqh 306 25

 
Stanislav Korotky:

剩下的是这个:

'm_array' - structures containing objects are not allowed Dictionary.mqh 306 25


第 306 行应替换为以下片段:

#ifdef __MQL4__
int t_size = ArrayResize(temp_array, ArraySize(m_array));
for(int i = 0; i < t_size; i++)
   temp_array[i] = m_array[i];
#else
ArrayCopy(temp_array, m_array);
#endif

在 MT4 的附件字典中

附加的文件:
Dictionary.mqh  39 kb
 
Vasiliy Sokolov:

第 306 行应替换为该片段:

在 MT4 的附件字典中。

这样就说得通了。非常感谢。

PS.对于归档中的零长度文件,确实会创建一个错误的文件头(在 ZipTask1 示例中),因此无法检索,但这是可以解决的,也许是测试本身的问题。

 
Stanislav Korotky:

有道理。非常感谢。

PS.对于归档中的零长度文件,确实会创建一个无效的文件头(在 ZipTask1 示例中),导致无法检索,但这是可以解决的,也许是测试本身的问题。

我会看看如何处理零长度文件。

 

问题出在哪里?我无法解压 zip.zip 文件(从示例中下载)。




日志。

18:25:47.809 脚本 zip_arc101 GBPUSD,H1: 载入成功

0 18:25:47.830 zip_arc101 GBPUSD,H1: 已初始化

0 18:25:47.830 zip_arc101 GBPUSD,H1: Handle= 1 GetLastError= 0

0 18:25:47.830 zip_arc101 GBPUSD,H1:FileReadArray= 11004

0 18:25:47.830 zip_arc101 GBPUSD,H1: Zip.CreateFromCharArray= true

0 18:25:47.830 zip_arc101 GBPUSD,H1: Archive successfully loaded.文件总数:7

0 18:25:47.836 zip_arc101 GBPUSD,H1: Zip.UnpackZipArchive= false

0 18:25:47.837 zip_arc101 GBPUSD,H1: Zip.UnpackZipArchive= false

0 18:25:47.837 zip_arc101 GBPUSD,H1: Zip.UnpackZipArchive= false

0 18:25:47.837 zip_arc101 GBPUSD,H1: uninit reason 0

0 18:25:47.839 Script zip_arc101 GBPUSD,H1: removed

 
void OnStart()
  {
//---
   uchar zip_array[];
   
   ResetLastError();
   
   int Handle = FileOpen("zip.zip", FILE_READ|FILE_BIN|FILE_COMMON );
   
   
   Print("Handle= ", Handle, "   GetLastError= ", GetLastError() );
   
   
   Print("FileReadArray= ", FileReadArray(Handle, zip_array) );
   
   
   Print("Zip.CreateFromCharArray= ", Zip.CreateFromCharArray(zip_array) );
   
   
   printf("Archive successfully loaded. Total files: "+(string)Zip.TotalElements());
   
   
   Print("Zip.UnpackZipArchive= ", Zip.UnpackZipArchive("NNN",FILE_COMMON) );
   
   Print("Zip.UnpackZipArchive= ", Zip.UnpackZipArchive("",FILE_COMMON) );
   
   Print("Zip.UnpackZipArchive= ", Zip.UnpackZipArchive("", 0) );
   
  }
//+------------------------------------------------------------------+
 

CZip::UnpackZipArchive 方法虽然完成了任务,但由于某些原因总是返回 false。这是一个错误。通过现场观察检查实际解压缩情况。

 
Vasiliy Sokolov:

CZip::UnpackZipArchive 方法虽然完成了任务,但由于某些原因总是返回 false。这是一个错误。通过观察检查实际解压情况。


是的。返回 false,但解压缩工作正常!

 

另一个问题是,如果我需要循环解压多个压缩包,只更改名称中的年份。

只有 d2014.zip 被解压,仅此而已。



0 01:57:36.772 Script zip_arc104 GBPUSD,H1: 载入成功

0 01:57:36.807 zip_arc104 GBPUSD,H1: 已初始化

0 01:57:36.807 zip_arc104 GBPUSD,H1: -------------- DD\d2014.zip

0 01:57:36.815 zip_arc104 GBPUSD,H1: DD\d2014.zip Zip.LoadZipFromFile= true

0 01:57:36.815 zip_arc104 GBPUSD,H1: Archive successfully loaded.文件总数:1

0 01:57:36.906 zip_arc104 GBPUSD,H1: Zip.UnpackZipArchive= false

0 01:57:36.906 zip_arc104 GBPUSD,H1: -------------- DD\d2015.zip

0 01:57:36.912 zip_arc104 GBPUSD,H1: DD\d2015.zip Zip.LoadZipFromFile= true

0 01:57:36.912 zip_arc104 GBPUSD,H1: Archive successfully loaded.文件总数:1

1 01:57:36.912 zip_arc104 GBPUSD,H1: invalidpointer access in 'Zip.mqh' (407,28)

0 01:57:36.913 zip_arc104 GBPUSD,H1: uninit reason 0

0 01:57:36.915 脚本 zip_arc104 GBPUSD,H1: 已删除