セットアップ プロジェクトの Calling Directory.Exists(“\\SERVER\SHARE\”)

StackOverflow https://stackoverflow.com/questions/554132

  •  23-08-2019
  •  | 
  •  

質問

カスタム インストーラー アクションを追加した .NET セットアップ プロジェクトがあります。セットアップ プロセス中に、ユーザーはファイル サーバー上の共有へのパス (多くの場合 UNC パス) を指定する必要があります。ディレクトリが存在することを確認する前に、次のようにいくつかの検証を試みます。

if (!Directory.Exists(serverDirectory)) { 
    throw new InstallException("Specified path does not exist or ..."); 
} 

非常にバニラ -- コンソール アプリでは、 Directory.Exists() コードは期待どおりに機能します。ただし、MSI のコンテキストではそうではありません。具体的には、次の呼び出し ディレクトリ.存在する ネットワーク リソースを使用すると常に失敗します。のドキュメント ディレクトリ.存在する 示しています なぜ:

Exists メソッドはネットワーク認証を実行しません。事前認証を受けずに既存のネットワーク共有をクエリすると、Exists メソッドは false を返します。

検索すると、偽装が解決策となる ASP.NET の他の同様のシナリオにたどり着きました。これはここでは当てはまりませんが、問題を説明しています。

ネットワーク パスの存在を確認するにはどうすればよいですか?ドキュメントの文言を言い換えると、通話前に事前認証を行うにはどうすればよいでしょうか?ユーザーは管理者としてインストールしており、Windows エクスプローラーでそのパスを参照すると正常に動作します。これはユーザーのアクセス許可ではなく、コードによるチェックが不足しているためです。

不要な懸念を生じさせてしまったのでしょうか -- これを省略して、後でネットワーク リソースを使用しようとするときに例外をスローすべきでしょうか...それはほとんど同じ重大な失敗ですよね?

役に立ちましたか?

解決

それはただ存在するだけではありません。権限もチェックする必要があり、チェックしてから実際に値を使用するまでの間に権限が変更された場合に何が起こるかを心配する必要があります。

したがって、通常のメカニズムは、すべてが正常であると想定することです。代わりに、前提が間違っていることが判明した場合の例外の処理に開発の労力を費やしてください。いずれにしても、それを適切に実行できる必要があるためです。

この場合、問題のディレクトリに小さなプレースホルダー ファイルをすぐに作成し、フォルダーの使用が完全に終了するまでそのファイルをロックしておくことで、問題を改善できる可能性があります。ファイルを作成しようとするとすぐにエラーが発生するため、より適切なフィードバックを提供できるようになります。また、フォルダーが 滞在します 少なくとも Windows では、そのファイルをロックしている限り、ユーザーはフォルダーを削除したり大幅に変更したりするのが難しいため、アクセス可能です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top