### 実現したいこと
MT4なるプログラムのterminalを、手動である手順を行えば、実現できる操作を、多数あるのでプログラムで自動化する処理をc++で実現したい。
前提
MT4なるプログラムのterminalを、手動である手順を行えば、実現できる操作を、多数あるのでプログラムで自動化する処理を考えています。
その際に必要な処理で躓いています。
ディレクトリの移動の段階で問題が発生しました(#5)
#5のcd datapath で ”ディレクトリ名が無効です”となりました。
添付ファイルのように、コマンドでひとつづつ深く移動すると成功します。(2回間違いました)
これはなぜでしょうか。最終場所の属性は、読み取り専用にチェックあり、隠しファイルにチェックなしとなっています。
アクセス権の問題なら、その前のコピーが通過していますのでよくわかりません。
このあたりになると難しいです。
発生している問題・エラーメッセージ
ディレクトリ移動の段階で、”ディレクトリ名が無効です”となる。
該当のソースコード
#include <stdio.h> #include <string.h> #include <stdlib.h> void main(int argct, char* argv[]) { char datapath[150]; char cmd[200]; sprintf(datapath,"C:\\Users\\qhtsi\\AppData\\Roaming\\MetaQuotes\\Terminal\\80A11734CBCE656863F9AC86485C80E3"); // #3 //strcpy(datapath,"C:\\Users\\qhtsi\\AppData\\Roaming\\MetaQuotes\\Terminal\\80A11734CBCE656863F9AC86485C80E3"); printf("go terminal datapath[%s]\n" , datapath); sprintf(cmd,"copy c:\\mt4\\xmdemo3\\setting.txt %s", datapath); // #4 system(cmd); // 正常にcopy確認 system("cd datapath"); // #5 ディレクトリ名が無効です //printf(cmd,"cd datapath"); // #51 ディレクトリ名が無効です //system(cmd); // system("cd datapath"); // #55 // system("c:\\mt4\\xmdemo3\\terminal setting.txt"); // #6 }
試したこと
#51のコード(どれくらい意味があるかわかりません。試しただけです)でも同じです。
補足情報(FW/ツールのバージョンなど)
VS 2022comunity使用。
copy の場合と同様にすればよいのではないでしょうか。
※ 子プロセスの中で cd を実行しても親プロセスのカレントディレクトリには反映されませんけれでも。。
sprintf(cmd, "cd %s", datapath);
system(cmd);
sprintf()ごどういう操作をするモノなのか…は調べて理解して欲しいところですよね。
んで、system()でディレクトリの移動について指摘されていますが…。
呼び出し元のプロセスと、子プロセスではそれぞれカレントディレクトリは別に扱われる…というのを理解していないとわからないでしょうね。
GUIで操作しているとカレントディレクトリとか意識しないでしょうし。
・system()で子プロセスを生成。
生成された子プロセスのカレントディレクトリは基本的に親のものを引き継ぐ。
・子プロセスでカレントディレクトリを変更。
ただし親プロセスには影響しない。
・子プロセスが終了。
もちろん、親プロセスのカレントディレクトリは影響していない。
・system()で別の子プロセスを起動。
もちろん親のカレントディレクトリが引き継がれる。
ということで、#6はカレントディレクトリが違うだけで動作するでしょう。
絶対パス指定でないファイルが扱えるかは別にして。
親プロセスのカレントディレクトリを変更する。のがマシかと思われます。
https://camedphone.com/archives/115
ご返事ありがとうございました。
またchdirのことも思い出しました。
よくわかりました。
melianさん。
ごへんじありがとうございます。
わかりました。
実はこの件は、昨晩寝るとき気が付きました(汗)。

回答2件
あなたの回答
tips
プレビュー