>たろさんは、試しに作ってみるのは最後の手段として、それ以外の方法で判別できるな
>ら可能な限りそうしたいと思っていますか?
おっしゃるとおりです。しかし、
「フォルダ選択後のアクセス権チェンジ、容量不足、ディスクが故障したとかネットワ
ークの断線など
書き込み時エラーに関しては、無視しあくまで選択決定時に明らかである判別結果でよ
いということなのでこの辺りは考えなくてよい」
というのを制約としてです。
>すから、場合によっては余分な制限がかかってしまうかもしれません。
DeviceIOControlを用いてメディアにプロテクトがかかっていた場合に
書き込めないということの判別が出来そうだったのでこれを使おうと考えました。
その余分な制限というのは書き込める場合でも書き込めないと判断される
ケースがあるということですか?
>ログファイルの場所をユーザに指定させない、というのはナシですか?
はい、 それはナシです。(実際はログファイルではないです。)
まだあまり よくわかっていないのでうまく書きようがなかったのですが、
>権限がなくても特権があればアクセスに成功する
まさにそのことを言いたかったが為にまず特権があればOKでという意味で書いたので
す。ACEからは特権に関しては読み取れないよという意味での指摘ですか?
そのほかにも色々とルールがあるみたいで
この辺りをきちんと押さえるのは大変そうですよね。
サンプルを見つけたいところです。。
> 書き込める場合でも書き込めないと判断されるケースがあるということですか?
はい。
例えば、CreateFile で PHYSICALDRIVEX を開くには管理者権限が必要です。
ドライブ自体が書き込み可能な種類かどうかは、チェックした時とその後で違うというこ
とは、あまりないと思いますから、実際に書き込みアクセスしてみるのではなく、種類に
よるチェックもそれなりに有効だと思います。
まぁ、メディアが入ってないとかはあるでしょうけど。
GetDriveType では書き込み可能かどうかは取得できないようです。
WMI を使えば可能かもしれません。例えばこのへん。
http://msdn.microsoft.com/en-us/library/aa394346.aspx
フロッピーの書き込み禁止タブの状態まで取得できるみたいですね。全てのドライブが対
応してるかどうかはわかりませんが。
C++ から WMI を使うのは面倒ですけどね。
> ACEからは特権に関しては読み取れないよという意味での指摘ですか?
はい。
アクセス権については、俺はいつもここを参考にしてます。
http://eternalwindows.jp/security/accesscontrol/accesscontrol00.html
まず、ドライブが物理的・論理的に存在するかどうかを調べて、存在してなければ、
「デバイスが存在しません。」等のエラーをだしてルーチンを抜ける。
次にデバイスの物理的な書き込みの有無に関しては実際に書込んでみなければ
分かりません。
> DeviceIOControlを用いてメディアにプロテクトがかかっていた場合に
> 書き込めないということの判別が出来そうだったのでこれを使おうと考えました。
DeviceIOControlは、基本的にデバイスドライバーとやり取りする関数ですよね。
ということは、CD-ROM,HD,外付けUSBメモリー,SCSI等によってコマンドが違います。
もちろんアドレスも変わります。ATAPI、USBSTOR等未だコマンドがあまり公開されて
いないドライバーもあります。
結構大変です。
セキュリティー等で書込みが制限されているかどうかの判定は何か方法があるかも
知れません。