読者です 読者をやめる 読者になる 読者になる

ながさわさんのアレグロモデラート

アレグロモデラート(Allegro moderato)は、速さを示す演奏記号で「穏やかに速く」

Dir関数やAPIのGetOpenFileNameでフォルダがロックされる

Visual Basic(クラシック)のDir関数で、あるフォルダの一覧を取得して、vbEmptyが返ってくるまで繰り返さないときは、内部的に何かの情報をもっているらしく、フォルダがロックされてしまい、削除や移動、名前の変更ができなくなる。vbEmptyになるまで繰り返せばロックははずれるのだが、ただでさえ、あまり早くないVisual Basicにそんなことをさせるのもアレなので、必ず存在する別のフォルダでDirをしてあげればファイルのロックはされなくなる。たとえば、消されたり、名前の変更がありえない、手堅いフォルダを選ぶとすれば、
Call Dir(Environ("HOMEDRIVE") & "\")

とかするのがよいだろう。実験はしてないが、FileSystemObjectを使えば、こういった問題は起こらないような気がする。(インスタンスをNothingすればどこにも覚えることはなくなるから。)

一方で、Windows APIのGetOpenFileNameでも同様の現象が起きた。こちらは、APIが表示するファイル選択ダイアログで、「開く」ボタンを押した直後で起こる。「キャンセル」では問題はない。API の問題であるから、回避できそうにないだろうと、ひさびさのゴッドエリアにうきうきしつつも、ちょっとググってみたら、次のようなページが。

[Win32]GetSaveFileName()使用後にフォルダがロックされる

要するに、GetSaveFileNameでも、GetOpenFileNameでも、正常に実行された場合は、アプリケーションのカレントディレクトリが移動してしまうというのだ。だからこれは、Visual BasicならばChDir関数を利用して、

Call ChDir(Environ("HOMEDRIVE") & "\")

とか
Call ChDir(Environ("SystemRoot"))

とかにするとよい。

しかし、後者の現象はともかく、僕とVisual Basicとのつきあいは就職してからだから10年目になるんだけど、前者の現象は、今の今まで知らなかった。こういった問題点を見つけ出す新人には、いろんな意味で恐れ入ります。。。



コメントキャンペーンですが、厳正なる抽選の結果、minos.vs氏が当選しました。おめでとうございます!minos.vs氏には豪華な粗品をプレゼントいたしますので、楽しみにお待ちください。(笑)

次回のコメントキャンペーンは近日中にやります。次回もみなさん、ふるってご応募ください。そうそう、インターネットは性悪説ですので、適当に個人情報流出しない程度で、私にわかるようにコメントしてください。よろしくお願いいたします。m(_ _)m