デジカメファイルをコピーする

CASIO EX-Z300には、"Photo Loader with HOT ALBUM"という、デジカメ写真をPCに取り込むツールが付属するのだけど、これが非常に微妙。

EX-Z55に付属していた"Photo Loader"の方がマシ。

基本的にどちらもファイルのExifを読んで撮影日のサブフォルダにファイルをコピーするのだけど、

  • with HOT ALBUMはいちいちコピーするファイルを指定する必要がある。基本的に全選択でよいのだけど、ワンクッション多い
  • with HOT ALBUMはファイル名を勝手に変える

以上のような気に入らない仕様があるのだけど、古いPhoto LoaderではEX-Z300の動画ファイルをコピーしてくれないので、仕方なくwith HOT ALBUMの方を使っていた。

ところが、2台のPCでSyncToyを使って同期しながらしばらく使っていたら、いつのまにか重複するファイルができていた。

幸い、Photo Loader時代のフォルダは残っていたし、EX-Z300のSDカードは購入以来撮り貯めしていて消したファイルは無い。

そこで、with HOT ALBUMでコピーしたファイルは捨てて、Photo Loaderで管理していたファイルをベースに、再度ライブラリを作り直すことにした。


ここで、デジカメファイルをPCにコピーするツールをVBScriptで自作してみた。

希望する仕様は、

  • Exifの撮影日でフォルダを作ってコピーする

これだけ。サムネイルとかいらないし、管理データベースとかいらない。デジカメ付属のツールはアルバム機能とか付加価値を付けたがるが、そんなのPicasaとか使った方がよっぽどよい。


VBScriptからExifを読むのにSImageUtilというCOM object DLLを使った。

http://www.reneris.com/tools/default.asp

ちなみに、Vista 64bitで普通にコマンドプロンプトを実行して、cscriptで.vbsを実行すると64bitのWSHで実行しやがるので、C:\windows\SysWow64\cscript.exe にスクリプトを渡して実行する必要がある。
64bitのWSHから32bitのDLLは利用できない。


以下参考ソース。エラー処理とかログとか省略。
exifのあるファイルはexifから撮影日を読んでいます。exifが取れないファイルはファイルの作成日で代用します。
BASEDIRで指定したフォルダの下位サブフォルダをすべて検索するので、携帯電話のメモリカードにもたぶん対応可能。

Const BASEDIR="K:\"

Const TARGETDIR="F:\test\"

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objImage = CreateObject("SImageUtil.Image")

Call GetSubItems(BASEDIR)

Private Sub GetSubItems(ByVal szDir)
	Dim objSubFolders
	Dim SubFolder
	
	Dim objFiles
	Dim File
	
	Set objSubFolders = objFSO.GetFolder(szDir)
	
	For Each SubFolder in objSubFolders.SubFolders
		WScript.Echo SubFolder.Path
		Call GetSubItems(SubFolder.Path)
	Next
	
	For Each File in objSubFolders.Files
		WScript.Echo "Source file is :      " & File.Path
		Call CopyPhotos(File.ParentFolder, File.Name, File.DateCreated)
	Next
	
	Set objSubFolders = Nothing
End Sub

Private Sub CopyPhotos(ByVal szFolder, ByVal szFile, ByVal szDate)
	Dim ShotDate

	objImage.OpenImageFile szFolder & "\" & szFile

	ShotDate = objImage.GetExif("Date")
	
	If ShotDate = "" Then
		ShotDate = Replace(Left(szDate, 10), "/", "")
	Else
		ShotDate = Replace(Left(ShotDate, 10), ":", "")
	End If
	
	If Not objFSO.FolderExists(TARGETDIR & ShotDate) Then
		objFSO.CreateFolder(TARGETDIR & ShotDate)
	End If
	
	WScript.Echo "Destination file is : " & TARGETDIR & ShotDate & "\" & szFile
	
	If Not objFSO.FileExists(TARGETDIR & ShotDate & "\" & szFile) Then
		objFSO.CopyFile szFolder & "\" & szFile, TARGETDIR & ShotDate & "\" & szFile, False
		WScript.Echo "1 File copyed."
	End If
	
	objImage.close
End Sub