トップ  >  MQL4リファレンス  >  ファイル関数
スポンサーリンク
検索

↑の検索エンジンが表示されない人は、
↓の古い検索エンジンを使用して下さい。
カスタム検索
MQL4リファレンスツリー
ファイル関数



ファイルを操作する為の関数です。

セキュリティ上の理由から、ファイル操作はMQL4言語で厳格に制御されます。
ファイルサンドボックス(セキュリティモデル)の外にあるファイルは、MQL4プログラムでファイル操作する事は出来ません。

作業ファイルを配置できるディレクトリは2つあります。

 ・"ターミナルデータディレクトリ\MQL4\Files" (ターミナルメニューで「ファイル」⇒「データフォルダを開く」で開かれる場所)
 ・コンピュータにインストールされた全ターミナルの共通フォルダ。
    (通常は"C:\Users\ユーザー名\AppData\Roaming\MetaQuotes\Terminal\Common"に配置されますが、基本的にOSに依存します)


他ディレクトリのファイルは操作出来ません。


TerminalInfoString()関数でENUM_TERMINAL_INFO_STRING列挙値を指定する事で、
これらのディレクトリを取得する事が出来ます。


サンプルソース:
void OnInit() {
    Print("ローカルディレクトリ:",TerminalInfoString( TERMINAL_DATA_PATH)        );
    Print("共通ディレクトリ    :",TerminalInfoString( TERMINAL_COMMONDATA_PATH ) );
}



ファイル関数はいわゆる"名前付きパイプ"(FIFO)で作業を行います。
これを行うには適切なパラメータでFileOpen()関数を呼び出します。
関数 詳細
FileFindFirst 指定したフィルタでディレクトリ内のファイルを検索
FileFindNext FileFindFirst()関数の検索を続けます
FileFindClose 検索ハンドル閉じます
FileOpen 指定した名前とフラグでファイルを開きます
FileDelete 指定したファイルを削除します
FileFlush 入力/出力ファイルバッファに残っている全データをディスクへ書き込みます
FileGetInteger ファイルプロパティ(int)を取得します
FileIsEnding ファイルの終端判定
FileIsLineEnding ファイルの行末判定
FileClose ファイルを閉じます
FileIsExist ファイルの存在有無チェック
FileCopy ファイルコピー
FileMove ファイルの移動・名前変更
FileReadArray BIN形式ファイルの配列読込み(文字列は読み込まない)
FileReadBool CSV形式ファイルの現在位置から読込み区切りまでの文字列を読み取り、
読み取った文字列をbool型データに変換します。
FileReadDatetime CSV形式ファイルから"YYYY.MM.DD HH:MI:SS","YYYY.MM.DD","HH:MI:SS"のいずれかの形式の文字列を読み取り、
datetime型データに変換します。
FileReadDouble 現在位置のファイルポインタからdouble値を読み取ります
FileReadFloat 現在位置のファイルポインタからfloat値を読み取ります
FileReadInteger 現在位置のファイルポインタからint,short,char値を読み取ります
FileReadLong 現在位置のファイルポインタからlong値を読み取ります
FileReadNumber CSV形式ファイルの現在位置から読込み区切りまでの文字列を読み取り、
読み取った文字列をdouble型データに変換します。
FileReadString 現在位置のファイルポインタから文字列(string)を読み取ります
FileReadStruct BIN形式ファイルを現在位置のファイルポインタから構造体データ読み取ります
FileSeek 指定した位置を基準にして、ファイルポインタを指定したバイト数分移動します。
FileSize ファイルサイズを返します
FileTell ファイルポインタの現在位置を返します
FileWrite CSVまたはBINファイルにデータを書き込みます
FileWriteArray BIN形式ファイルに配列データ内容を書き込みます(文字列を除く)
FileWriteDouble BIN形式ファイルにdouble型データを(現在のファイルポインタから)書き込みます
FileWriteFloat BIN形式ファイルにfloat型データを(現在のファイルポインタから)書き込みます
FileWriteInteger BIN形式ファイルにint型データを(現在のファイルポインタから)書き込みます
FileWriteLong BIN形式ファイルにlong型データを(現在のファイルポインタから)書き込みます
FileWriteString CSVまたはBIN形式ファイルに文字列(string)データを(現在のファイルポインタから)書き込みます。
FileWriteStruct BIN形式ファイルに構造体データの値を(現在のファイルポインタから)書き込みます
FolderCreate "Files"ディレクトリ内に新しいフォルダを作成します
FolderDelete 指定したディレクトリを削除します。フォルダが空で無い場合は削除出来ません
FolderClean 指定したフォルダ内のファイルを全て削除します
FileOpenHistory "history"ディレクトリ(またはそのサブフォルダ)のファイルを開きます



ファイルがFileOpen()関数使用して書き込み用に開かれている場合、
パスで指定されたサブフォルダが存在しない時は、指定したサブフォルダが全て作成されます。

管理人の勝手なコメント:
上記一覧にはありませんが、ストラテジーテスター動作中にファイル関数を使用した場合、 MQL4/Filesフォルダではなく、tester/fileフォルダのファイルが操作されます。




ファイル検索のサンプル


サンプルソース(スクリプト):
#property strict // strictは絶対に削除しない事
#property script_show_inputs

input string InpFilter="*"; // 検索フィルタ

//+------------------------------------------------------------------+
//| スクリプトプログラムスタート
//+------------------------------------------------------------------+
void OnStart(){
  
    string file_name;
    int    i=1;
    long   search_handle;
    int    errorcode;
    
    printf("%sフィルタでローカルディレクトリを検索。",InpFilter);
    search_handle = FileFindFirst(InpFilter,file_name,0); // ローカルディレクトリを検索
    
    if ( search_handle != INVALID_HANDLE) {

        do {
            ResetLastError();                  // エラーコードリセット
            FileIsExist(file_name);            // 見つかったファイル名で存在チェック
            errorcode = GetLastError();        // 指定した名前がディレクトリの場合はエラーコード5019を返します

            PrintFormat("%dつ目 : %s名 = %s",
                           i, errorcode== ERR_FILE_IS_DIRECTORY ? "ディレクトリ" : "ファイル" ,file_name);
            i++;

        } while( FileFindNext(search_handle,file_name) == true );
        // 次の検索を行い、見つかったら処理を繰り返す
    
        FileFindClose(search_handle); // ファイルハンドラクローズ
    } else {
        Print("対象ファイル無し");
    }
}


ローカルフォルダの内容



結果:
*フィルタでローカルディレクトリを検索。
1つ目 : ファイル名 = entry_access.bin
2つ目 : ファイル名 = FXCM_ECOFILE.htm
3つ目 : ファイル名 = test_file.txt
4つ目 : ディレクトリ名 = test_folder\


*.txtフィルタでローカルディレクトリを検索。
1つ目 : ファイル名 = test_file.txt




ファイル書き出しのサンプル


サンプルソース(スクリプト):
#property strict // strictは絶対に削除しない事

static string RelativeFileAddress   = "";                // 相対ファイルアドレス
const  string WriteFolderName = "FileWriteTest";         // フォルダ名
const  string WriteFileName   = "WriteTestData.csv";     // ファイル名

//+------------------------------------------------------------------+
//| スクリプトプログラムスタート
//+------------------------------------------------------------------+
void OnStart()
{
    SetPath();  // パス設定
   
}


//+------------------------------------------------------------------+
//| パス設定
//+------------------------------------------------------------------+
void SetPath()
{
    // 相対ファイルアドレスセット
    RelativeFileAddress = StringFormat(
                   "%s\\%s" ,
                   WriteFolderName , 
                   WriteFileName
               );

    int filehandle;                    // ファイルハンドラ

    // 書き込むファイルを開く(存在しなければ作成される)
    filehandle = FileOpen(
            RelativeFileAddress,    // ファイル名
            FILE_WRITE | FILE_CSV,  // ファイル操作モードフラグ
            ','                     // セパレート文字コード
    );

    if ( filehandle == INVALID_HANDLE ) { // ファイルオープンエラー
        printf( "[%d]ファイルオープンエラー:%s" , __LINE__ , RelativeFileAddress );
    } else {
        WriteData(filehandle);      // ファイル書き出し

        FileClose(filehandle);      // ファイルハンドラクローズ(絶対に忘れない事)
        // FileCloseを忘れると開いたMT4以外で対象ファイルが操作出来なくなります
    }

}


//+------------------------------------------------------------------+
//| データ書き出し
//+------------------------------------------------------------------+
void WriteData( int in_filehandle ){
    
    FileWrite( in_filehandle , "test1" );
    FileWrite( in_filehandle , "test2" , "test3" );
    FileWrite( in_filehandle , "test4" );
    
}



■結果





スポンサーリンク
スポンサーリンク


Copyright ©2015 MT4でEA自作しちゃお~ All Rights Reserved.


Top

inserted by FC2 system