2012-10-16 11 views
7

私は "スクリプト"と呼ばれるサブフォルダ内のスクリプトの読み込みを必要とするアプリケーションを作成しようとしています。
Directory.GetCurrentDirectory()はLinux上で動作していませんか?

string script = Console.ReadLine(); 
string path = Directory.GetCurrentDirectory(); 
string sciptpath = path + "/scripts/" + script; 

これは、Windows上で正常に動作します:私のコードは、私が問題を抱えています。しかし、Linux(Mono Runtimeを使用して実行中)では、実行可能ファイルのディレクトリではなく、現在のユーザーのホームディレクトリに移動します。これはバグですか?誰かが回避策を提案できますか?

+0

あなたはhttp://www.mono-project.com/Compatibilityに対してモノラルの互換性を確認しましたか?また、.NetアプリケーションをMono(http://www.mono-project.com/MoMA)に移植する際に発生する可能性のある問題を特定するMono Migration Analyzer(MoMA)ツールを試すこともできます。 –

+0

問題はありませんが、パスを連結しないで、代わりにPath.Combineを使用してください:string scriptpath = Path.Combine(path、 "scripts"、script); - WindowsとLinuxの両方で正しく動作します。 –

答えて

11

「修正」が必要なわけではありません。現在のディレクトリは、あなたの考えではないということです。現在のディレクトリは、相対パスに「フォーカスがある」ディレクトリです。あなたのEXEがどこにあっても、現在のディレクトリはどこにでも置くことができ、実行中に変更することさえできます。

何をしたいです:

string path = Path.GetDirectoryName(Application.ExecutablePath); 
+0

これは素晴らしい仕事をしてくれてありがとう。私は実際にはDirectory.SetCurrentDirectory(Path.GetDirectoryName(Application.ExecutablePath))を実行しなければなりませんでした。問題を解決する。どうもありがとうございます! – user1750201

+1

正当な理由がない限り、カレントディレクトリを変更しないでください。 –

+0

一般的なルールとして、現在のディレクトリをユーザーが管理するリソースとして扱う必要があります。ユーザーが開始した要求を処理するときに使用する必要があります(たとえば、GUIアプリケーションの一部のダイアログからファイルを開く)。 そして、ユーザーがこれを期待するときにのみ変更する必要があります。 アプリケーションの一部である追加のファイルを自動的にロードすると、それは通常はユーザーには見えないか、少なくともユーザーには気にする必要はありません。したがって、アプリケーションのインストールディレクトリに基づいてパスを計算し、現在のディレクトリは使用しないでください。 –

関連する問題