初めて質問させていただきます。
[環境]
Windows XP Pro
VS.NET Pro 2003 (MFC使用)
[質問]
あるディレクトリに入っているファイルを読み込んで、それを表示するという作業を行
っているソフトがあります。
ソフトからそのファイルごとディレクトリを削除しようとすると、使用中で削除できな
い、と言われてしまいます。
そのディレクトリには他に何も入っておらず、ファイルだけなら問題なく削除できま
す。
だた、ディレクトリのみ削除できないという状況です。
エクスプローラから操作しても同じ状況で、そのソフトを終了すると削除できるように
なります。
ソフトが起動中でもそのディレクトリを削除する方法はありますでしょうか?
ファイルはCFileを用いて読み込んでいて、デストラクタで閉じられているはずなのです
が、そのファイルが入っているディレクトリはソフトが終了するまで使用中になってし
まうのでしょうか?
何か方法があれば、ご教授よろしくお願いします。
GetCurrentDirectoryを使って見てください。
削除したいディレクトリがカレントの場合、削除できません。
SetCurrentDirectoryを使って他のディレクトリにカレントを変更しましょう。
レスありがとうございます。
GetCurrentDirectoryで見ると、削除したいディレクトリにはなっていませんでしたし、
念のためSetCurrentDirectoryで他のディレクトリに変更してもだめでした。
SHFileOperationでディレクトリごとファイルを移動しようとしているのですが、ディレ
クトリの削除に失敗しているという状況です。
ファイルの移動はできています。
RemoveDirectoryを用いても削除できませんでした。
ファイルを1度も開かなかった場合は移動できますので、移動に関するソースコードには
誤りはないと思います。
GetPrivateProfile*、WritePrivateProfile*で読み書きしたファイルが存在する場合に
ディレクトリの削除に失敗することがわかりました。
しかし、これらの関数を使うときは、明示的にファイルをオープン、クローズすること
がありません(もちろん裏ではされていると思いますが)。
何か対処法はありませんでしょうか?
追加です。
GetPrivateProfile*、WritePrivateProfile*で読み書きしたファイルでも、ファイル自
体は移動(削除)が可能ですので、ファイルのクローズはされているということになると
思います。
ただ、そのファイルが入っていたディレクトリの削除ができません。
ディレクトリの中のファイルを削除する時にCFileFindを使っていますよね?
ディレクトリを削除する前にCFileFind::Closeでリソースを開放しないと、
その後の操作に共有違反が発生します。
ファイルを全て削除してCFileFindが必要なくなった時に、CFileFind::Closeを
呼び出して下さい。それでディレクトリが削除できる状態になります。
ともさん、ありがとうございます。
解決しました。
ファイルの移動時にはSHFileOperationを使おうとしていまして、また、試しに書いたコ
ードではパスを直接指定してコピーや削除をしていましたので、この部分では
FindFirstFileは使っていなかったのですが、たまたま上記のGetPrivateProfile*などで
読み書きしていたファイルに対してクローズするのを忘れていたのが原因でした。
私はファイルの検索にはFindFirstFile関数を使っていたのですが、CFileFindを使えば
オブジェクトの消滅時に自動的に閉じてくれるようですね。
(MFCのソースを見るとデストラクタでClose()していました)
私は中途半端にMFCを使っていまして、こんなクラスがあるのを知りませんでした。
MFCって色々自動でやってくれるので便利ですが、CFileFindを使うことによって、
FindFirstFile関数を直接使うより大幅にスピードが落ちるということはないですよね?
(コードを見るとごちゃごちゃしていて良くわからなかったのですが)