MFC,VC++7.0,WinXPで作成しております。
ファイルのディレクトリにロックをかけるにはどのようにしたらよいのでしょうか。
3つののファイルを開くダイアログを表示し、
3つのエディットボックス各々にCFileDialogでファイル位置を設定し、
OKボタンが押されたタイミングでエディットボックスの文字列を受け取り、
ファイルを開くようにしております。
しかし、この場合、ロックがかかっていないので、OKボタンを押される前にディレク
トリ、ないしはファイルを削除される可能性があります。
このばあい、ロックをかけるにはどのようにすればよろしいでしょうか。
ご教授お願い致します。
一般的に、そういうことはしません。
ファイルを開いてみて、失敗したらメッセージボックスでも出してやり直し、というの
が普通でしょう。
「ロック」と言う操作は無かった筈ですが似た操作は出来ます。
しかし、シャノンさんの言うとおり、失敗時の処理も実装するのが普通です。
開くだろうファイルをロックしても、エディットボックスを直接書き換えたい人が、間
違えてしまった場合や、別の理由によってオープンに失敗することもあるためで
す。
あえてロックしたいのならば、エディットボックスにファイル名を設定した後か、エ
ディットボックスが変更された直後に、エディットボックスに指定されたファイルを開
いてしまうことでロックできます。
オープン時にオブジェクトの共有方法を指定すれば許可する操作を指定できま
す。
自分が読み取るだけのファイルならば「CreateFile」で「FILE_SHARE_READ」を
「dwShareMode」に、MFCならば「CFile::shareDenyWrite」を
「nOpenFlags」に、指定し、書き換えも行うのならば「CreateFile」で「0」を
「dwShareMode」に、MFCならば「CFile::shareExclusive」を
「nOpenFlags」に、指定すればいいと思います。
ファイルを共有モードで書き換え禁止にしておけば、削除はされない筈です
し、ファイルの残っているディレクトリは通常削除できません。
なお、ディレクトリのみをロックする場合は「CreateFile」でやったほうが良いと思い
ます。
注意事項は、ロックのために開いたハンドルないし作成したクラスインスタンス
(CFile等)を、ロックが必要なくなったときに確実に開放することです。
このケースでハンドルを使う場合は、ダイアログクラスのメンバにハンドルなどをメン
バとして持たせ、コンストラクタでNULLに初期化、デストラクタでNULL以外の場
合は開放し、ロックする前にNULL以外ならいったん古いハンドルを開放してから
ロックしましょう。
クラスインスタンスでロックする場合はクラスのメンバなどにしておけば特に上記の
注意を意識する必要は無いかと思われますが、細かい設定が出来ません。
ダイアログクラスメンバ以外で宣言する場合は適宜開放して下さい。
これらのハンドルないしインスタンスは、同時にロックしておきたい数だけ宣言して
下さい。
一つで同時に複数のロックは出来ません。
この場合は3つです。
ですが、本当にロックが必要かどうか良く考えてください。
無用なロックは無駄以外の何者でもありません。
エラー処理はあるに越したことは無いです。
自分がロックしようとして、その寸前に誰かが先に削除したらエラーメッセージ出すしか
ないよね?
シャノンさん、通りすがりさん、oさん、ありがとうございます。
シャノンさんのおっしゃったとおり、
ファイルを開いてみて、エラーメッセージを出すという方法にしました。
通りすがりさんのロックも悩んだのですが、
そこまでロックが必要ではないという判断で今回は見送りました。
しかし、とても勉強になりました。
今後、ロックをかける必要がでた際の参考にしようと思います。
oさんのおっしゃったことも一理あります。
ロックをかけても、
結局はファイルが存在するかチェックをかける必要があるような気もします。
以上です。
ご教授、ありがとうございました。
> ロックをかけても、
> 結局はファイルが存在するかチェックをかける必要があるような気もします。
いやいや。
俺はフォルダにロックをかける方法は知りませんが、
仮にロックをかけることができたなら、ファイルの存在チェックは要らないでしょう。
そうではなく、ロックをかける前にフォルダが削除されたらどーすんの? ってことか
と。
あ、勘違いでした。
失礼しました。