- PR -

C#2003で別Exeを起動したときのカレントフォルダについて

1
投稿者投稿内容
匿名希望
常連さん
会議室デビュー日: 2006/12/12
投稿数: 23
投稿日時: 2007-01-19 10:53


C#2003でA.ExeからB.Exeを起動しようと思っています

B.Exeは、
Process.Start(@"c:\B.exe");
を使ってB.exeを起動します

B.Exeのコード内には、「Directory.GetCurrentDirectory()」の
コードが複数個所存在しています

B.Exeを直接起動した場合、Directory.GetCurrentDirectory()の戻り値は、
B.Exeのカレントフォルダになるのですが、

A.Exeから、Process.Start(@"c:\B.exe");を使用して、B.Exeを起動した場合、
B.Exeのカレントフォルダが、A.Exeのカレントフォルダになってしまいます
どーなっているんでしょうか??

出来ることなら、B.Exeは運用されていますので、A.Exeでどうにかしたいのですが。。
御教授宜しくお願いします



ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-01-19 11:09
引用:

匿名希望さんの書き込み (2007-01-19 10:53) より:

B.Exeを直接起動した場合、Directory.GetCurrentDirectory()の戻り値は、
B.Exeのカレントフォルダになるのですが、

A.Exeから、Process.Start(@"c:\B.exe");を使用して、B.Exeを起動した場合、
B.Exeのカレントフォルダが、A.Exeのカレントフォルダになってしまいます
どーなっているんでしょうか??


それはそういうものだと思います。
B.exe を直接起動したときは、エクスプローラが B.exe の存在するディレクトリにカレ
ントディレクトリを移動させてから B.exe を起動しているのでしょう。
B.exe を変更したくないとすれば、A.exe 側で B.exe のディレクトリ(例で言うと C:\ )
にカレントディレクトリを移動してから B.exe を起動してあげればいいと思います。

そもそもカレントディレクトリに依存するようなプログラムを書くなという話ではありますが、
そのあたりは現状がそうなってしまっている(過去の負の遺産?)ので仕方がないという
感じでしょうか。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2007-01-19 11:15
ProcessStartInfoで設定できた気がします。
たしかWorkingDirectoryだったかな。。。(自信なし)
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2007-01-19 11:25
引用:

匿名希望さんの書き込み (2007-01-19 10:53) より:
A.Exeから、Process.Start(@"c:B.exe");を使用して、B.Exeを起動した場合、
B.Exeのカレントフォルダが、A.Exeのカレントフォルダになってしまいます
どーなっているんでしょうか??


A.EXEの環境をB.EXEが引き継いでいるだけです。今まではたまたまB.EXEのカレントフォルダが、B.EXEを置いてあるフォルダになっていただけです。一部のAPIではカレントフォルダが移動してしまう場合もありますし、カレントフォルダが実行ファイルの置かれているフォルダと考えてコーディングするのは危険です。

引用:

出来ることなら、B.Exeは運用されていますので、A.Exeでどうにかしたいのですが。。
御教授宜しくお願いします


B.EXEを起動する前にA.EXE内でカレントフォルダを移動するか、StartInfoで作業フォルダを明示的にしていすれば良いはずです。
_________________
甕星 <mikahosi@abox9.so-net.ne.jp>
http://blogs.msmvp.jp/mikahosi/
匿名希望
常連さん
会議室デビュー日: 2006/12/12
投稿数: 23
投稿日時: 2007-01-19 11:29
Process p=new Process();
p.StartInfo.FileName=B.exeのフルパス;
p.StartInfo.WorkingDirectory=B.exeのカレントディレクトリフォルダ;
p.Start();

で問題なく動作しました

素早い御教授ありがとうございました
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-01-19 23:03
引用:

匿名希望さんの書き込み (2007-01-19 11:29) より:
Process p=new Process();
p.StartInfo.FileName=B.exeのフルパス;
p.StartInfo.WorkingDirectory=B.exeのカレントディレクトリフォルダ;
p.Start();

で問題なく動作しました

素早い御教授ありがとうございました


「B.exeのカレントディレクトリフォルダ」なんて書いているあたり、そういう問題じゃないと思う。current って、辞書引いてみた?

引用:

カレントフォルダが実行ファイルの置かれているフォルダと考えてコーディングするのは危険です。


こういう問題だと思う。
OpenFileDialog を出したりすると変わってしまうのに。。。
あと、B.exe の方が、Assembly.GetExecutionAssembly で、「実行中のアセンブリのフルパス」を取って、そこからディレクトリを割り出すべきかと。
_________________
1

スキルアップ/キャリアアップ(JOB@IT)