2

プロセスに書き込み権限がないフォルダーにファイルをダウンロードするように求められたときに、WebClientはサイレントに (例外をスローせずに) 失敗します。

using (WebClient webClient = new WebClient())
{
    webClient.DownloadFile(url, outputPath);
}
if (!File.Exists(outputPath)) logger.Warn("Could not download file.");

コードは、LOCAL SERVICE で実行されている Windows サービスで 1 分に 1 回のループで実行され、アクセス許可が削除されたフォルダーに書き込もうとしていました。ターゲット フォルダーに適切なアクセス許可を復元した瞬間、ダウンロードは成功し始めました。

これは既知の動作ですか? バグですか?出力ファイルの存在を確認することは、DownloadFile が成功したかどうかを判断する正しい方法ですか?

4

1 に答える 1

0

これは既知の動作ですか?

いいえ。ドキュメントによると:

ASP.NET ページなどの中間層アプリケーションでこのメソッドを使用すると、アプリケーションを実行するアカウントにファイルへのアクセス許可がない場合、エラーが発生します。

したがって、基本的に、このコードを実行しているアカウントにターゲット フォルダーへの書き込み権限がない場合、例外が発生します。


バグですか?

私はそうは思わない。


出力ファイルの存在を確認することは、DownloadFile が成功したかどうかを判断する正しい方法ですか?

いいえ、ドキュメントに明示的に記載されているように、指定されたフォルダーへのアクセス許可がない場合、File.Existsは false を返すためです。

呼び出し元が指定されたファイルを読み取るための十分なアクセス許可を持っていない場合、例外はスローされず、メソッドはパスの存在に関係なく false を返します。

したがって、おそらく権限で何かを台無しにしました。たとえば、フォルダーへの書き込み権限はあるが読み取り権限がない場合、DownloadFile成功しますが、File.Exists は false を返します。

于 2012-04-06T21:16:18.090 に答える