4

最近、アプリケーションにGetTempPathの使用を追加しました。コード レビュー中に、GetTempPath の説明に次の情報が含まれていることが強調されました。

アプリケーションは、ファイル I/O 操作に使用する前に、パスの存在とパスへの適切なアクセス権を確認する必要があります。

これで、すべてのファイル アクセスが try/catch ブロックでラップされ、独自の一時ディレクトリにアクセスできないシステムが存在するでしょうか?

私の最初のアイデアは、ディレクトリが存在しない場合は (GetFileAttributes および CreateDirectory を介して) 作成を試み、次にファイルを作成し、バイトを書き込んでからファイルを削除することです。それは機能しますが、無知のようです-フォルダーへの書き込みアクセス権があることを確認するより良い方法は確かにありますか?

ファイル属性定数、汎用アクセス権、標準アクセス権、ファイル アクセス権定数、および GetSecurityInfo 関数を探し始めました。これらはすべて、ファイルを作成してそれが固執するかどうかを確認するよりも長いソリューションを作成するように見えました.

では、WinAPI 関数を使用して、フォルダーへの書き込みアクセス権があることを確認する正しい方法は何ですか?

4

2 に答える 2

4

MSDNのメモは誤解を招く恐れがあります。返されたパスが存在するかどうかを確認する(存在しない場合は作成する)こともできますが、そこに書き込むことができるかどうかを知る唯一の方法は、そこに書き込むことです。

さらに、今そこに書くことができるからといって、後でそこに書くことができるという意味ではありません。ユーザーや他のプログラムは、物を削除したり、セキュリティ設定を変更したり、ディレクトリをロックしたりする可能性があります。自分が書き込める場所であることを事前に検証しようとすると、時間の無駄になります。必要なときに書くだけで、失敗に備えることができます。

于 2012-01-23T17:26:23.930 に答える
3

最良の方法は、ディレクトリにファイルを書き込もうとすることです。権限がないために書き込みに失敗した場合は、エラー コードでそのことがわかります。を探しERROR_ACCESS_DENIEDます。

他の方法で実行しようとすると、とにかく実行しようとしていたシステム コードを複製することになります。また、現在のバージョンの Windows と将来のバージョンで完全に複製できる可能性はほとんどありません。

ファイルを作成して 1 バイトを書き込む必要はありません。一時フォルダーへの書き込みアクセス権があると仮定して、必要なファイル全体を書き込もうとします。失敗が発生した場合は、プロセスを終了することもできます。一時フォルダーに書き込めない場合は、続行してもあまり意味がありません。

于 2012-01-23T15:14:42.790 に答える