Filesフォルダに作成されたファイルをMoveFileExWを使って移動させるプログラム

おはようございます。
fx-on.comの岩淵です。
昨夜からドル円が絶賛暴落中でございます。
この記事を執筆中も一瞬114円台をつけていました。
今年の相場は随分と荒れていますので皆さんお気をつけてトレードして下さい。
では本題です。
MQL4でプログラムを作っていると、テキストファイルを出力したりcsvファイルを出力したりする機会があるかと思います。
MT4でファイル作成処理をすると、作成されたファイルはデータフォルダのMQL4フォルダ内にあるFilesフォルダ内に保存されます。
(バックテスト時はTesterフォルダ内のFilesフォルダに作成されます)
しかしファイル作成をやっていると、Filesフォルダ以外のフォルダ(例えばExpertsフォルダ)へ保存したい場面が多々あったので、今回はその方法をお伝えいたします。
準備
Filesフォルダ内に予めtest.txtを作成しておきます。 今回はFilesフォルダ内に作成したtest.txtをExpertsフォルダ内へ移動したいと思います。コード
スクリプトとしてファイルを作成していきます。 今回はFileNameという外部パラメータを用意し、このパラメータに指定されたファイルをFilesフォルダからExpertsへ移動させたいと思います。extern string FileName = "test.txt";ソースコードの上部にて、Kernel.dllからMoveFileExWをインポートします。
#import "Kernel32.dll" bool MoveFileExW( string &lpExistingFileName, //既存のファイル名 string &lpNewFileName, //新しいファイル名 int dwFlags //移動オプション ); #import第3引数に指定するパラメータも定義しておきます。
#define MOVEFILE_REPLACE_EXISTING 0x1MoveFileExWの基本的な使い方は、第1引数に移動したいファイル名、第2引数に移動後のファイル名、第3引数には先ほど定義MOVEFILE_REPLACE_EXISTINGを指定するだけです。 MoveFileExの詳しい使い方についてはこちらをご参考にしてください。 https://msdn.microsoft.com/ja-jp/library/cc429621.aspx MoveFileExのインポートさえ出来てしまえば、あとは適切なファイル名を指定して関数を実行するだけです。 ただしファイル名はファイルまでのパスも含めて指定する必要があります。 データフォルダまでのパスはTerminalInfoString(TERMINAL_DATA_PATH)で取得できますので、それを利用します。
string existing_file, new_file; existing_file = TerminalInfoString(TERMINAL_DATA_PATH); existing_file += "\\MQL4\\Files\\"; existing_file += FileName; new_file = TerminalInfoString(TERMINAL_DATA_PATH); new_file += "\\MQL4\\Experts\\"; new_file += FileName;ソースコード全体は以下の通りです。
#property version "1.00"
#property strict
#property show_inputs
#import "Kernel32.dll"
bool MoveFileExW(
string &lpExistingFileName, //既存のファイル名
string &lpNewFileName, //新しいファイル名
int dwFlags //移動オプション
);
#import
#define MOVEFILE_REPLACE_EXISTING 0x1
extern string FileName = "test.txt";
void OnStart(){
string existing_file, new_file;
existing_file = TerminalInfoString(TERMINAL_DATA_PATH);
existing_file += "\\MQL4\\Files\\";
existing_file += FileName;
new_file = TerminalInfoString(TERMINAL_DATA_PATH);
new_file += "\\MQL4\\Experts\\";
new_file += FileName;
if(MoveFileExW(existing_file, new_file, MOVEFILE_REPLACE_EXISTING)){
Alert("ファイルを移動しました。");
}
else{
Alert("ファイルの移動に失敗しました。");
}
}
完成したスクリプトを実行するとFilesフォルダに保存されていたtext.txtがExpertsフォルダ内に移動します。
簡単でしたが以上です。



