CDir (MT5) - 一个用于取得目录内容的类 - MetaTrader 5程序库
- 显示:
- 1480
- 等级:
- 已发布:
- 2017.05.03 15:23
- 需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
有的时候需要转到沙盒之外,在文件系统中读取内容来检查文件或者目录是否存在。另外,您可能需要找到一个文件或者目录的属性,文件大小,创建时间,最后访问或者写入时间等等,以下代码显示了如何解决这些问题的实例:
标准语法和变量的描述,以及对源代码的链接,就是代码中的 #include <WIN_API\Dir_API.mqh> 所做的,包含类是明确指示编译器应该在文件夹 \MQL5\Include\WIN_API 下寻找文件。您可以自由改变链接,这依赖于您组织工作的设置,应当与 文档 保持一致。
//+------------------------------------------------------------------+ //| ExampleDirClass.mq4/5 | //| Copyright © 2017, Avatara | //| https://www.mql5.com/en/users/avatara | //+------------------------------------------------------------------+ #property copyright "Copyright © 2017, Avatara" 2017/02/12 #property link "https://www.mql5.com/en/users/avatara" #property description "-- Dir 实例类 --------------" #property strict #include <WIN_API\Dir_API.mqh> //+------------------------------------------------------------------+ //| 脚本程序起始函数 | //+------------------------------------------------------------------+ void OnStart() { File_Def File; // 工作结构 CDir Dir; int total,i; string path = TerminalInfoString(TERMINAL_COMMONDATA_PATH)+ "\\..\\..\\Terminal"; //---
我们可以看到,字符串变量 path 包含了文件夹的路径,它比运行终端目录的标准位置高两层,并且我们(如果没有使用 /portable(可移动) 选项) 可以获得包含所有终端用户用户数据的目录路径。
用心的读者可能会说我们做得多了 - 只要向上一层就能得到正确的目录,但是如果我们转到了另一个目录会怎么样呢,比如转到 Crashes(崩溃) 或者 Tester(测试器)目录?这里是一个更有说服力的实例,
让我们回顾例子代码。
/--- total = Dir.Create(path); // 初始目录 Print (path," Total=",total-3); //Common(通用),Help(帮助),以及Community(社区)没有计算在内 for (i = 0;i<total;i++) { string nameFile = Dir.GetNameFile(i); if(nameFile == "Common"||nameFile=="Help"||nameFile=="Community") continue; File = Dir.GetStruct(i); Print (StringFormat ("%37s \t%8X\t %5s\t",nameFile, File.FileAttributes,File.isDir?"-SubDir-":""), File.isDir?" ":IntegerToString(File.FileLength,12), File.CreationTime," ",File.LastWriteTime," ", File.LastAccessTime); } Dir.Clear(); //---
创建一个类的实例,我们就能够在total变量中得到元素(文件和子目录)的数量,通过组织一个循环,我们可以打印出终端目录的列表(跳过共享目录),让我们展示通过访问File类的数据结构来访问实例的数据。
path=TerminalInfoString(TERMINAL_PATH)+ "\\.."; Dir.Create(path,"\\M*"); // 使用过滤器 "M*" Print ("可以访问:"); total = Dir.Size(); Print (Dir.Path," 总数=",total); for (i = 0;i<total;i++) { Print (StringFormat("%57s \t%8X \t %s \t",Dir.GetNameFile(i), Dir.GetStruct(i).FileAttributes, Dir.isDir(i)?"--- 子目录 ---": IntegerToString(Dir.GetFileLength(i),14)), "\t 最后修改时间: ",Dir.GetLastWriteTime(i)); } //--- Dir.Clear();
打印目录内容部分的实例 (使用的是选择了以M开头的元素) 演示了操作类成员的其他方法。
在下面部分代码中,我们检查特定的文件是否存在以及查看它的长度。
//--- 用于检查文件 path="C:"; Print("------------ 用于检查文件 ---------------------"); stringfilter="\\pagefile.sys"; Dir.Create(path,filter); total=Dir.Size(); PrintFormat("找到了 %d 记录.",total); if(total>0) for(i =0;i<total;i++)Print("文件搜索 \"",path,filter, "\" 返回:",Dir.isDir(i)?"--- 子目录 --- "+ Dir.GetNameFile(i):Dir.GetNameFile(i)+ IntegerToString(Dir.GetFileLength(i),14)+" byte. \t", StringFormat("属性=%X",Dir.GetAtributes(i))); else Print("文件 ",path,filter," 不存在."); //--- Dir.Clear();
测试脚本的最后是使用类实例的引用来保存目录内容元素:
//--- 使用指针来访问数据
path="C:\\Temp";
//---------------------> 声明指针 CDir_API *e; Print("------ 指针应用实例. --------"); total =Dir.Create(path); PrintFormat("%s 找到了 %d 记录.",path,total); if(total>0) for(i =0;i<total;i++) { e=Dir.GetPointers(i); Print(StringFormat("%77s \t%8X\t %5s\t ",e.Name_File, e.FileDef.FileAttributes,e.FileDef.isDir?"-子目录-":""), e.FileDef.isDir?" ": IntegerToString(e.FileDef.FileLength,12)," ", e.FileDef.CreationTime," ", e.FileDef.LastWriteTime," ", e.FileDef.LastAccessTime); } else Print("文件 ",path,filter," 不存在."); //--- Dir.Clear(); Print("------------- 结束. -----------------------"); } //+------------------------------------------------------------------+
我不怀疑大部分读者都将使用这个方法来在他们的工作中访问类成员,
可能还需要额外的信息来了解属性:
FILE_ATTRIBUTE_ARCHIVE 32 (0x20) | 文件或目录是一个归档文件或者目录。应用程序通常使用这个属性来标记文件来备份或者删除。 |
FILE_ATTRIBUTE_COMPRESSED 2048 (0x800) | 文件或者目录是压缩的。对于文件,文件中的所有数据都是压缩的,对于目录,默认是新创建的文件和子目录是压缩的。 |
FILE_ATTRIBUTE_DEVICE 64 (0x40) | 这个值是保留给系统使用的。 |
FILE_ATTRIBUTE_DIRECTORY 16 (0x10) | 句柄标识的是一个目录。 |
FILE_ATTRIBUTE_ENCRYPTED 16384 (0x4000) | 文件或者目录是加密的,对于文件,文件中的所有的数据流都是加密的,对于目录,默认是新创建的文件和子目录是加密的。 |
FILE_ATTRIBUTE_HIDDEN 2 (0x2) | 文件或者目录是隐藏的,它在普通的目录列表中没有包含。 |
FILE_ATTRIBUTE_INTEGRITY_STREAM 32768 (0x8000) |
目录或者用户数据流使用完整性配置 (只在 ReFS 卷支持). 它在普通的目录列表中没有包含。如果文件被重新命名,它的完整性设置还会保存,如果一个文件被复制,而源文件或者目标目录有完整性设置的话,目标文件将包含完整性设置。 Windows Server 2008 R2, Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003 和 Windows XP: 这个标志直到 Windows Server 2012 才不支持. |
FILE_ATTRIBUTE_NORMAL 128 (0x80) | 文件不包含其他属性设置。这个属性只有在单独使用它的时候才是有效的。 |
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 8192 (0x2000) | 文件或者目录没有被内容索引服务索引。 |
FILE_ATTRIBUTE_NO_SCRUB_DATA 131072 (0x20000) |
用户数据刘不能被后台数据完整性扫描读取 (就是 scrubber). 当在目录上设置的时候,它只能继承。这个标志值在存储空间和 ReFS 卷支持,它在普通的目录列表中没有包含。 Windows Server 2008 R2, Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003 和 Windows XP: 这个标志到 Windows 8 和 Windows Server 2012 就不支持了。 |
FILE_ATTRIBUTE_OFFLINE 4096 (0x1000) | 文件的数据不是立即可用的。这个属性指出文件的数据被物理性移动到离线存储中了,这个属性只有远程存储使用,也就是继承存储管理软件。应用程序不应该强制改变这个属性。 |
FILE_ATTRIBUTE_READONLY 1 (0x1) | 文件是只读的。应用程序可以读取文件,但是不能写入它或者删除它。这个属性最好不要用在目录上。如需了解更多信息,参见 您不能读取或者改变文件夹的系统属性或者只读,应用于 Windows Server 2003, Windows XP, Windows Vista 或者 Windows 7. |
FILE_ATTRIBUTE_REPARSE_POINT 1024 (0x400) | 文件或者目录有联系的分析点,或者文件是一个符号链接。 |
FILE_ATTRIBUTE_SPARSE_FILE 512 (0x200) | 文件是稀疏文件。 |
FILE_ATTRIBUTE_SYSTEM 4 (0x4) | 操作系统使用了文件或者目录的一部分,或者有排他使用。 |
FILE_ATTRIBUTE_TEMPORARY 256 (0x100) | 文件用于临时存储。如果快速闪存内存足够,文件系统会避免把数据写到存储上,应用程序会在临时文件句柄关闭后删除它。在这种情况下,系统可能完全避免写入数据,否则,数据在句柄关闭后会写入。 |
FILE_ATTRIBUTE_VIRTUAL 65536 (0x10000) | 这个值是保留给系统使用的。 |
我希望这个例子和类本身会对您有用。
赶紧试试吧!
由MetaQuotes Ltd译自俄语
原代码: https://www.mql5.com/ru/code/17623
XRSXCandleKeltner 指标,带有突破指示选项。
XCCXCandleKeltnerPluseXCCXCandleKeltner 指标,带有突破指示选项。