2012-01-23 28 views
4

私は最近、アプリケーションにGetTempPathの使用を追加しました。コードレビューの際には、GetTempPathの記述は情報が含まれていることを強調した:ディレクトリをチェックする正しい方法は書き込み可能です

アプリケーションはファイルI/O操作のための任意の使用に先立って、パスにパスし、適切なアクセス権の有無を確認する必要があります。

これで、すべてのファイルアクセスがtry/catchブロックでラップされ、自分の一時ディレクトリにアクセスできないシステムはありますか?

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

ファイル属性定数、一般アクセス権、標準アクセス権、ファイルアクセス権定数、およびGetSecurityInfo関数が見つかりました。そのすべてが、ファイルを作成するよりも長い解決策を作り出し、それがメソッドを固執するかどうかを確認していました。

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

答えて

4

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

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

+0

+1私は同意する100% –

+0

特に、AV製品が関与するとゲームが変化するため、彼らは、セキュリティの名前でtempフォルダ内のいくつかの操作をブロックすることでよく知られています。実行可能ファイルをブロックします。 – Deanna

3

最も良い方法は、ファイルをディレクトリに書き込むことです。権利がないために書き込みに失敗した場合は、エラーコードがその旨を通知します。 ERROR_ACCESS_DENIEDを探してください。

これ以外の方法で試してみると、とにかく実行しようとしていたシステムコードだけが複製されます。現在のバージョンのWindowsとそれ以降のバージョンでは完全に複製する機会はほとんどありません。

ファイルを作成して1バイトを書き込む必要はありません。一時フォルダへの書き込み権限があり、必要なファイル全体を書き込もうとしていると仮定します。問題が発生した場合は、プロセスを終了することもできます。テンポラリフォルダに書き込めない場合は、あまり進んでいません。

+0

私はファイルを書き、アクセス拒否メッセージが表示されるのを見て、どうにかなるコードを複製します。ディレクトリが存在し、書き込み可能であるかどうかをテストしたい場合は、デフォルトのディレクトリに戻すことができます。 –

+1

気にしないでください。 MSDNドキュメントのそのセクションは、GetTempPath APIがディレクトリを作成しないことを意味しています。それは、それが存在しないことが普通であるか妥当であるということを意味するものではありません。一時フォルダがそこにあると仮定してそれに書き込みます。失敗した場合は、ユーザーにエラーを報告し、あきらめてください。作業用の一時フォルダをソフトウェアの前提条件とすることを検討してください。あなたの「デフォルトのディレクトリ」が利用できない場合はどうすればいいでしょうか?あなたはそれのために後退しますか?あなたはどこかに線を引く必要があります。 –

+0

私は同じ問題があります。ある時点で、私はいくつかのディレクトリへの書き込みアクセス権があるかどうかを知る必要があります。今、私は(そのディレクトリにランダムな名前のファイルを作成し、作成が成功したかどうかをチェックし、ファイルを削除する)機能するソリューションを持っています。唯一の問題は、ディレクトリが書き込み専用の場合、直前に作成されたファイルを削除できない場合に発生します。 –

関連する問題