欢迎访问 外汇EA下载与MT4/MT5自动交易资源 - 聚合外汇EA、黄金EA、量化交易工具与自动化交易实战内容。
登录 注册

CDir (MT5) - 用于获取目录内容的类 - MetaTrader 5 库

author emer | 938 人阅读 | 0 人评论 |

CDir (MT5) - a class for getting directory contents - library for MetaTrader 5

CDir (MT5) - a class for getting directory contents - library for MetaTrader 5

有时需要超越沙箱并读取内容来检查文件系统中文件或目录是否存在。另外,您可能需要查找文件或目录的属性、文件大小、创建时间、上次访问或写入。以下代码显示了如何解决这些问题的示例:

标准序言和变量描述以及 #include 包含类源代码的链接是对编译器的隐式指令,指示编译器应在文件夹 \MQL5\Include\WIN_API 中查找文件。您可以根据您在包含文件的工作组织中的偏好,自由更改此链接。文档

//+------------------------------------------------------------------+
//|                                            示例DirClass.mq4/5 |
//|                                        版权所有 © 2017,阿凡达 |
//|                            https://www.mql5.com/en/users/avatara |
//+------------------------------------------------------------------+
#财产版权 “版权所有 © 2017,阿凡达”            2017年/02/12
#财产关联      “https://www.mql5.com/en/users/avatara”
#财产描述 “-- 目录类示例 --------------”
#财产严格的
#包括//+------------------------------------------------------------------+
//|脚本程序启动函数                                   |
//+------------------------------------------------------------------+
空白 启动时()
  {
   File_Def 文件;            // 工作结构   Cdir 目录;整数总计,i;     
  细绳路径=终端信息字符串TERMINAL_COMMONDATA_PATH)+
              “\\..\\..\\终端”;//---      

我们可以看到,字符串变量小路包含文件夹的路径,该路径比运行终端目录的标准位置高两级,并且我们(如果/便携的未使用选项)获取包含该用户的所有客户端的用户数据的目录路径。

有思想的读者会说我们做了额外的动作 - 为了进入正确的目录,升一级就足够了。但是,如果我们想导航到另一个文件夹(例如 Crashes 或 Tester)怎么办?这是一个更有启发性的例子。

CDir (MT5) - a class for getting directory contents - library for MetaTrader 5

让我们回到示例代码。

/---    
   总计 =目录.创建(路径);      // 初始化目录  打印(小路,“总计=”,全部的-3);//Common,Help && 社区不计算    为了(我=0;i<总计;i++)
    {
    细绳名称文件 =目录.GetNameFile(i);
    如果(名称文件==“常见的”||名称文件==“帮助”||名称文件==“社区”)
                                                              继续;
    文件=目录.GetStruct(i);
    打印字符串格式“%37s \t%8X\t  %5s\t”,名称文件,
    文件.文件属性,文件.isDir“-子目录-”””),
    文件.isDir“            ”整数转字符串文件.文件长度,12),
    文件.创建时间,“     ”,文件.LastWriteTime,“     ”,
    文件.上次访问时间);
    }
    目录.Clear();//---    

创建类实例后,我们收到该类中元素(文件和子目录)的数量全部的多变的。通过组织循环,我们可以打印终端目录列表(跳过共享目录)。让我们通过访问工作数据结构的副本来说明对实例数据的访问文件班级。

  路径=终端信息字符串终端路径)+
              “\\..”;
    目录.创建(路径,“\\M*”);  // 使用过滤器“M*”          打印“替代访问:”);
    总计 =目录大小();    打印目录路径,“总计=”,全部的);
    为了(我=0;i<总计;i++)
    {
    打印  (字符串格式“%57s \t%8X \t %s \t”,目录.GetNameFile(i), 
                        Dir.GetStruct(i).FileAttributes,
                        目录.isDir(i)“--- 子目录 ---”: 
                        整数转字符串目录.GetFileLength(i),14)),
    “\t   最后修改:”,目录.GetLastWriteTime(i));
    }//---        目录.Clear();  

打印部分目录内容的示例(使用选择开头包含 M 字母的元素)演示了处理类成员的其他方法。

在下面的代码中,我们检查特定文件是否存在并找出其长度。

//---  用于检查文件    路径=“C:”;
    打印“------------用于检查文件---------------------”);
    细绳过滤=“\\页面文件.sys”;
    Dir.Create(路径,过滤器);    总计=目录大小();
    打印格式“找到 %d 个条目。”,全部的);
    如果(总计>0)
      为了(我=0;i<总计;i++)打印“文件搜索\””,路径,过滤器,
        “\”是回车:“,目录.isDir(i)“--- 子目录 ---  ”+
        目录.GetNameFile(i)目录.GetNameFile(i)+
        整数转字符串目录.GetFileLength(i),14)+“字节。\t”,
        字符串格式“属性=%X”,目录.GetAtributes(i)));
    别的  打印“文件 ”,路径,过滤器,“缺席了。”);//---    目录.Clear();              

测试脚本以使用对存储目录内容元素的类实例的引用的示例结束:

  //--- 使用指针访问数据

   路径=“C:\\温度”;

我毫不怀疑大多数读者会在工作中使用这种方法来访问类数据。

可能需要其他信息来理解属性:

目录或用户数据流配置为完整性(仅在 ReFS 卷上受支持)。它不包含在普通目录列表中。如果重命名,完整性设置将保留在文件中。如果复制文件,如果源文件或目标目录设置了完整性,则目标文件将设置完整性。

Windows Server 2008 R2、Windows 7、Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP:Windows Server 2012 之前不支持此标志。

用户数据流不会被后台数据完整性扫描器(又称为清理器)读取。当在目录上设置时,它仅提供继承。仅存储空间和 ReFS 卷支持此标志。它不包含在普通目录列表中。

Windows Server 2008 R2、Windows 7、Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP:Windows 8 和 Windows Server 2012 之前不支持此标志。

我希望这个例子和课程本身对您有用。


附件下载

📎 dir_api.mqh (16.64 KB)

📎 exampledirclass.mq5 (7.66 KB)

Source: MQL5 #17623

🔐
请登录后参与评论
注册满12小时后评论,即可解锁附件下载
立即登录