9

だから...私はあなたがファイルにアクセスしたがパスなしで名前を指定したとき(私の場合はCAISLog.csv)、.NETはファイルが実行中の.exeと同じパスにあることを期待すると思っていました。

これは、ソリューション(C#.NET2。* VS2K5)をステップ実行しているが、ファイルにアクセスする代わりに通常モード(Websphere MQトリガーモニターによって開始され、ネットワークサービスとしてバックグラウンドで実行されている)でアプリを実行している場合に機能します.exeが検索されているパスで、C:\ WINDOWS\system32にあります。重要な場合親タスクの.exeは、私のアプリとほぼ同じフォルダー構造/パスにあります

一致するエラーが発生します:「System.UnauthorizedAccessException:パス'C:\ WINDOWS \ system32\CAISLog.csv'へのアクセスが拒否されました。

私の回避策は、ファイルの場所を完全に修飾することです。ただし、理解したいのは、「IO中にファイル名のみが指定された場合に、パスがどのように解決されるかを管理する.NETルールとは何ですか?」です。 私はいくつかの基本的な概念が欠けていると感じており、それは私をひどく悩ませています。

編集-それ自体が.NETルールかどうかはわかりませんが、Schmuliは概念をもう少し明確に説明しているようです。私は間違いなくRobProuseの提案を将来試してみるので、それも+1します。

誰かが私の.exeへのパスを見つけることを本当に気にしないことを強調するいくつかの言い換えの提案がある場合-むしろ相対的なパス解決で何が起こっているのか理解していませんでした(そして私はまだ私の用語を台無しにしているかもしれません) ..。。

4

4 に答える 4

12

アプリケーション(WinForms)が起動すると、Environment.CurrentDirectoryにはアプリケーションフォルダー(つまり、.exeアセンブリを含むフォルダー)へのパスが含まれます。ファイルダイアログのいずれかを使用します。OpenFileDialogSaveFileDialogなどを指定すると、現在のディレクトリが変更されます(別のフォルダが選択されている場合)。

Windowsサービスを実行している場合、そのフォルダーはC:\ Windows \ System32です。これは、システムフォルダーであり、実際にWindowsサービスを実行しているのはシステム(つまり、オペレーティングシステム)です。

ほとんどのオブジェクトで相対パスを指定すると、プロパティSystem.IOの使用にフォールバックすることに注意してください。Environment.CurrentDirectory

前述のように、サービス実行可能ファイルのパスを取得するには、プロパティまたはプロパティのいずれかを使用するか、Assembly.GetEntryAssembly()使用する方法がいくつかあります(これは、実行可能ファイルのディレクトリではなく、ファイルパスであることに注意してください)。Assembly.GetExecutingAssembly()LocationCodeBase

別のオプションは使用することです:

`System.IO.Directory.SetCurrentDirectory( System.AppDomain.CurrentDomain.BaseDirectory );`

サービスのOnStartメソッドで呼び出しを行い、アプリケーション全体に適用します。

于 2008-11-05T21:55:21.910 に答える
9

特に別のプログラムまたは別の作業ディレクトリのショートカットから起動した場合、アプリケーションが存在する場所と同じである場合と同じでない場合がある現在の作業ディレクトリに基づいています。

パスをハード コードするのではなく、プログラムへのパスを取得して使用します。このようなものでこれを行うことができます

Assembly ass = Assembly.GetEntryAssembly();
string dir = Path.GetDirectoryName(ass.Location);
string filename = Path.Combine( dir, "CAISLog.csv" );

これは、エントリ アセンブリがファイルの場所にあることを前提としています。そうでない場合は、アセンブリを次のように変更できます。

Assembly ass = Assembly.GetAssembly( typeof( AClassInYourAssembly ) );
于 2008-11-05T20:13:37.713 に答える
4

相対パス解決は、起動実行可能ファイルのパスに対して機能することはありません。これは常にプロセスの現在のディレクトリに対して機能し、.exeが存在するディレクトリに常に設定されることを期待することはできません。

その動作が必要な場合は、自分で正しいパスを見つけて、ファイル操作への完全修飾パスを提供するように注意してください。

于 2008-11-05T20:10:12.213 に答える
-2

これを使用して、exe @ "..\CAISLog.csv"と同じパスにあるパスを指定できます。二重のドットは、.exeがある場所の親ディレクトリを示していることに注意してください。

RWendi

于 2008-11-05T20:27:58.387 に答える