私たちのファンページに参加してください
CDir (MT5) - ディレクトリの内容を取得するクラス - MetaTrader 5のためのライブラリ
- ビュー:
- 1150
- 評価:
- パブリッシュ済み:
- 2017.05.10 12:36
- このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動
ファイルシステム内のファイルやディレクトリの存在を確認するために、サンドボックス外の内容を読み取る必要がある場合があります。また、ファイルやディレクトリの属性、ファイルサイズ、作成時間、最後のアクセス権、または書き込みを見つける必要があるかもしれません。次のコードは、これらの問題を解決する方法の例を示しています。
コンパイラが暗黙の指示を受けて、#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 "-- Example Dir Class --------------" #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文字列変数には実行中のターミナルディレクトリの標準位置より2つ上のフォルダへのパスが含まれていて、(/portable オプションは使用されていない場合)そのユーザーのすべてのクライアント端末のユーザーデータを含むディレクトリへのパスが取得されます。
思慮深い読者は、正しいディレクトリに行くためには1レベル上げるだけで十分で、私たちは余計なことをしているとおっしゃるでしょう。しかし、Crashesや Testerのような別のフォルダに移動する場合はどうでしょうか?これはより有益な例です。
例のコ―ドに戻ってみます。
/--- total = Dir.Create(path); // initディレクトリ 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 ("Alternative access:"); total = Dir.Size(); Print (Dir.Path," Total=",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)?"--- SubDir ---": IntegerToString(Dir.GetFileLength(i),14)), "\t Last modify: ",Dir.GetLastWriteTime(i)); } //--- Dir.Clear();
ディレクトリ内容の一部を印刷する例(冒頭にM文字を含む要素の選択を使用)は、クラスメンバと作業するための他のメソッドを示しています。
コードの次の部分では、特定のファイルの存在を確認し、その長さを調べます。
//--- ファイルの確認に使用する path="C:"; Print("------------ Use to check the file ---------------------"); stringfilter="\\pagefile.sys"; Dir.Create(path,filter); total=Dir.Size(); PrintFormat("Find %d entry.",total); if(total>0) for(i =0;i<total;i++)Print("File search \"",path,filter, "\" is return:",Dir.isDir(i)?"--- SubDir --- "+ Dir.GetNameFile(i):Dir.GetNameFile(i)+ IntegerToString(Dir.GetFileLength(i),14)+" byte. \t", StringFormat("Atributes=%X",Dir.GetAtributes(i))); else Print("File ",path,filter," is absent."); //--- Dir.Clear();
テストスクリプトは、ディレクトリ内容要素を格納しているクラスのインスタンスへの参照を使用する例で終了します。
//--- データアクセスにポインタを使用する
path="C:\\Temp";
//---------------------> ポインタの宣言 CDir_API *e; Print("------ Pointer use example. --------"); total =Dir.Create(path); PrintFormat("%s Find %d entry.",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?"-SubDir-":""), e.FileDef.isDir?" ": IntegerToString(e.FileDef.FileLength,12)," ", e.FileDef.CreationTime," ", e.FileDef.LastWriteTime," ", e.FileDef.LastAccessTime); } else Print("File ",path,filter," is absent."); //--- Dir.Clear(); Print("------------- The end. -----------------------"); } //+------------------------------------------------------------------+
ほとんどの読者が、このメソッドを使用してクラスデータにアクセスすることは間違いありません。
属性を理解するためには追加情報が必要な場合があります。
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) |
ディレクトリまたはユーザーデータストリームは、integrityで構成されています(ReFSボリュームでのみサポート)。通常のディレクトリリストには含まれていません。ファイルのintegrity設定はファイル名が変更されても維持されます。ファイルがコピーされると、ソースファイルまたはコピー先ディレクトリのいずれかにintegrityが設定されていれば、コピー先ファイルのintegrityが設定されます。 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) |
バックグラウンドデータintegrityスキャナー(AKAスクラバー)によって読み取られないユーザーデータストリーム。ディレクトリに設定すると、継承のみが提供されます。このフラグは、Storage Spacesおよび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) | 読み取り専用のファイル。アプリケーションはファイルを読むことはできますが、書き込んだり削除したりすることはできません。この属性はディレクトリでは受け入れられません。詳細についてはYou cannot view or change the Read-only or the System attributes of folders in Windows Server 2003, in Windows XP, in Windows Vista or in 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指標
XCCXCandleKeltnerPluseブレークアウト表示オプション付きのXССXCandleKeltner指標