FileSystemObjectでフォルダをコピーするときの注意

FileSystemObjectでフォルダを作る

当方、10年以上前から音楽ファイルの再生にはfoobar2000を使っています。

f:id:akashi_keirin:20190912074539j:plain

CDから楽曲データをリッピングしてエンコードするときに、勝手にフォルダを作っていくタイプのソフトウエアにどうしてもなじめなくて、面倒だけれど自力でフォルダ構築してきたのです。

長年使っていると、やはりフォルダの数がえらいことに。

普段づかいのHDDにはflacでため込んでいるのですが、Walkmanなんかに入れるときは、容量の問題もあってなるべくmp3にしたい。でもそうなると、〈フォルダごとコピー〉という技が使えない。使ったとしても、flacファイルごとコピーされるので、一旦flacファイルを消す手間が生じる。

VBAを始める前は、仕方なく手作業でこうした作業をしていましたが、今は違う。

〈フォルダ構成まるごとコピー〉ぐらいなら(やり方がエレガントかどうかは別として)苦も無く出来るようになりました。

そこで、上には書かなかった〈もう一つの問題〉に取り組むことにしました。

もう一つの問題

「もう一つの問題」。それは、〈アルバムアートの画像ファイルはどうすんの?〉問題である。

音楽フォルダ内では、

f:id:akashi_keirin:20190912074544j:plain

こんなふうにフォルダを作っている。何のことはない、アルバムごとにフォルダを作っているだけ。

で、各アルバムフォルダには、flacファイルと、アルバムアート用のfolder.jpgというファイルが入っている。

f:id:akashi_keirin:20190912074549j:plain

マクロを作ってフォルダ構成を丸ごとWalkmanの音楽フォルダにコピーしたとて、アルバムごとのfolder.jpgは別途手作業でコピーせねばならんかったのだ。

対応

しかし、今の私はかつての私とはちがう。I'm not the man who I was used to be. である(英語はこれでいいのだろうか?)。

フォルダをコピーするときに、コピー元フォルダの中にfolder.jpgがあれば、それをコピーするという一手間加えるだけでよい。

それはすでにできている。

しかし、今回の本題はそこではない。もっと初歩的なことだ。

本題

ようやくここで本題だ。たぶん、前置きの方が長い。許せ。

本題は、〈FileSystemObjectでフォルダを作るときの注意〉だ。

準備

テキトーなフォルダ上に、次のようなフォルダを準備する。

f:id:akashi_keirin:20190912074553j:plain

Test1というフォルダの中に、ahobokekasusuttokodokkoiというフォルダがある。

さらに、ahoフォルダの中にはAnthraxMegadethMetallicaSlayerフォルダがあるのだ。実はさらにMetallicaフォルダの中にはさらにフォルダが作ってあるのだが、今回は関係ないので省略する。

では、このTest1フォルダ内にahoフォルダを作ろうとするとどうなるのか。

次のコードで実験。

リスト1 標準モジュール
Option Explicit

Private fsObj As FileSystemObject

Private Sub test01()
  If fsObj Is Nothing Then _
    Set fsObj = New FileSystemObject
  Dim targetDir As String
  targetDir = ThisWorkbook.Path & "\Test1\aho"
  Call fsObj.CreateFolder(targetDir)
End Sub

このマクロを書いたブックと同じフォルダにあるTest1フォルダの中にahoフォルダを作ろうというのだから、ahoフォルダのフルパスはThisWorkbook.Path & "\Test1\aho"

こいつをFileSystemObject.CreateFolderメソッドに渡してやるだけ。何て簡単!

ただし、上でも書いたように、Test1\ahoフォルダは既に存在している。さて、どうなることか。

f:id:akashi_keirin:20190912074558j:plain

ちゃんとエラーを吐いてくれた。

何も言わずに上書きされてしまうのではたまらんが、これは親切設計。

おわりに

フォルダの存在確認をして、なかったらフォルダ作成、というようにしたければ、最後の1行を

If Not fsObj.FolderExists(targetDir) then _
  Call fsObj.CreateFolder(targetDir)

とすればよろしかろう。FolderExistsというのもメチャメチャわかりやすくて好きです。

私もこんな命名ができるようになりたい……。

フォルダコピー関連の具体的な話はまたこんど……w