この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 31124|答える: 2

[コンソールプログラム] 現在のディレクトリを取得するにはSystem.Environment.CurrentDirectoryに注意してください

[リンクをコピー]
掲載地 2020/11/10 15:04:17 | | | |
最近の仕事では、クライアントのリマインダー用の小さなツールを作りたいと思っています。 当然ながら、winformプログラムはアプリケーションと同じディレクトリの設定ファイルを読み取らなければなりません(exe.configファイルではありません)。

現在のアプリケーションがあるディレクトリを読むために、すぐにSystem.Environment.CurrentDirectoryを使って現在の作業ディレクトリを取得しました。 プログラムは完璧に動作しているように見えます。

翌朝出勤すると、「設定ファイルを読み取れません」と表示されました。 アプリには起動自動スタート機能が追加されています。 このメッセージは設定ファイルの失敗を読み取り、アプリケーションディレクトリ内の設定ファイルが自動的に削除されているかどうかを直ちに確認します。 確認したところ、ファイルはまだそこにあり、プログラムを終了して再度実行しました

それでも問題なく、ポップアップの既読プロファイルが欠けていません。 それからレジストリの起動エントリのパスがディレクトリにないか確認してください。 パスファイルを見ると問題ありません。 少し混乱していますか? パソコンからログアウトして再起動を試みても、設定ファイルが消えて表示されます。 道が見つからない理由は直接取られます

MessageBoxというプログラムは実行し、そのパスが確かにこのパスであることを発見します。

MessageBoxのコードを追加してテストを起動を続けてください。 起動してみると、現在表示されていたディレクトリがC:\Windows\System32で、すぐに戸惑いました。 私は思いました。老子のプログラムはsystem32まで下がったのではないかと。 レジストリを確認してもsysetm32には私のアプリがありません。 最後に、パスを取得するコードに問題があるはずだと考えました。

繰り返しテストの結果、System.Environment.CurrentDirectoryは確かに現在のディレクトリを取得する役割ですが、プログラムAがプログラムBを呼び出し、プログラムBがSystem.Environment.CurrentDirectoryを使ってディレクトリを取得する場合、 すると、Bプログラムで取得されたディレクトリはもはやBアプリケーションが存在するディレクトリではなくなり、 Aが所在するディレクトリとなります。 起動時にポップアップするディレクトリがC:\Windows\System32であることは難しくありません。なぜなら、起動セルフスタートプログラムはWindowsのプロセスによっても呼び出されているからです。

したがって、winformプログラムが現在のアプリケーションが存在するディレクトリを取得したい場合は、System.Environment.CurrentDirectoryは使わない方が良いです。 代わりに、Application.StartupPathと呼ばれます。この方法なら、誰が呼び出そうと関係ありません。

テストコード:




転属先:ハイパーリンクのログインが見えます。




先の:K8Sネットワークフランネルとカリコの比較
次に:C#はプロービングを通じてリファレンスライブラリのDLLをサブフォルダに配置します
 地主| 掲載地 2020/11/10 15:08:26 |
C#は、現在のプログラムの実行パスを取得するためのメソッドの集合です

現在のプロセスへの完全なパス(ファイル名(プロセス名)も取得してください。
ストリングストル=これ。 GetType()。 集会・所在地;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

新しいプロセスコンポーネントを取得し、現在アクティブなプロセスに関連付けるメインモジュールへの全パス(ファイル名(プロセス名)も含まれます。
string str = System.Diagnostics.Process.GetCurrentProcess(). MainModule.FileName;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

//获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。
string str = System.Environment.CurrentDirectory;
result: X:\xxx\xxx (.exe文件所在的目录)

現在のスレッドのアプリケーションドメインのベースディレクトリを取得し、アセンブリのコンフリクトソルバーがアセンブリを探査するために使用します。
string str = System.AppDomain.CurrentDomain.BaseDirectory;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

アプリケーションを含むディレクトリの名前を取得して設定します。 (おすすめ)
string str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

アプリケーションを起動した実行ファイルへのパスを取得しますが、実行ファイル名は除外します。
string str = System.Windows.Forms.Application.StartupPath;
result: X:\xxx\xxx (.exe文件所在的目录)

//获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。
string str = System.Windows.Forms.Application.ExecutablePath;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

アプリケーションの現在のワーキングディレクトリを取得してください(信頼性が低いです)。
string str = System.IO.Directory.GetCurrentDirectory();
result: X:\xxx\xxx (.exe文件所在的目录)
掲載地 2021/09/22 20:38:52 |
学ぶことを...
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com