質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

Q&A

解決済

2回答

874閲覧

systemコマンドでcdが有効にならない。

sigefuji

総合スコア125

VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

0グッド

0クリップ

投稿2023/03/05 11:42

編集2023/03/05 11:46

イメージ説明### 実現したいこと
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);![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-03-05/c2c84720-857d-4d1f-a72c-498e98f2d4dd.png) 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使用。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2023/03/05 11:48

copy の場合と同様にすればよいのではないでしょうか。 ※ 子プロセスの中で cd を実行しても親プロセスのカレントディレクトリには反映されませんけれでも。。 sprintf(cmd, "cd %s", datapath); system(cmd);
setoppu

2023/03/05 12:19

sprintf()ごどういう操作をするモノなのか…は調べて理解して欲しいところですよね。 んで、system()でディレクトリの移動について指摘されていますが…。 呼び出し元のプロセスと、子プロセスではそれぞれカレントディレクトリは別に扱われる…というのを理解していないとわからないでしょうね。 GUIで操作しているとカレントディレクトリとか意識しないでしょうし。 ・system()で子プロセスを生成。  生成された子プロセスのカレントディレクトリは基本的に親のものを引き継ぐ。 ・子プロセスでカレントディレクトリを変更。  ただし親プロセスには影響しない。 ・子プロセスが終了。  もちろん、親プロセスのカレントディレクトリは影響していない。 ・system()で別の子プロセスを起動。  もちろん親のカレントディレクトリが引き継がれる。 ということで、#6はカレントディレクトリが違うだけで動作するでしょう。 絶対パス指定でないファイルが扱えるかは別にして。 親プロセスのカレントディレクトリを変更する。のがマシかと思われます。 https://camedphone.com/archives/115
sigefuji

2023/03/05 23:05

ご返事ありがとうございました。 またchdirのことも思い出しました。 よくわかりました。
sigefuji

2023/03/05 23:07

melianさん。 ごへんじありがとうございます。 わかりました。 実はこの件は、昨晩寝るとき気が付きました(汗)。
guest

回答2

0

ベストアンサー

system("cd datapath"); // #5 ディレクトリ名が無効です

これは、カレントディレクトリーに、datapathと言う名前のものがあるが、それはディレクトリーではなくて、普通のファイルだという時に出るメッセージです。
カレントディレクトリーにdatapathと言う名前のファイルがあるのでしょう。

datapathという名前のディレクトリーにcdしたいわけじゃなくて、プログラム中のdatapathという変数に入っている文字列の示すディレクトリーにcdしたいのなら、前の質問で教えて貰ったsprintfを教えて貰った通りに使えば出来ます。

なお、system関数でcdだけするのは無意味です。cdした後に実行したいコマンドを続けて書く必要があります。これは、cdの結果がそのsystemで起動したコマンドライン内だけで有効だからです。

参考:
system("cd C:\\ & dir");・・・・Cドライブのルートディレクトリーのファイル一覧を表示
system("cd C:\\");system("dir");・・・・カレントディレクトリーのファイル一覧を表示(1つめのsystem()は意味無し)

投稿2023/03/05 12:49

otn

総合スコア84557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sigefuji

2023/03/05 23:02

ご返事ありがとうございます。 よくわかりました。 実は、この問題は、昨晩床についたとき、気が付きました。 今朝、正しくすると、最終的な目的が果たせたことがわかりました。 また、新しい参考になることを教えていただきました。 丁寧なご説明ありがとうごあいました。
guest

0

CDが有効にならない、のではなく、移動先のディレクトリが存在しない、というはなしです。
カレントディレクトリはどこで、どこに移動しようとしているのか確認してみては。

#で、system関数でディレクトリ移動しても、それが有効なのはその関数の中だけですが

投稿2023/03/05 11:48

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sigefuji

2023/03/05 23:03

ご返事ありがとうございました。 よくわかりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問