こんにちは朱夏です。
今回は、ファイルを圧縮する方法を調べてみました。
前回ログファイルをコピーする事が出来ました。
今回はコピーして持ってきたファイルを、圧縮して保管しておきたい時に使おうと思って調べました。
それではいってみましょう。
[もくじ]
ファイル圧縮の書き方
ファイルコピーから圧縮までを合体
あとがき
ファイル圧縮の書き方
ファイルコピーから圧縮までを合体
あとがき
ファイル圧縮の書き方
今回はこちらのサイトを参考にさせていただきました。
出来上がったコードはこちらになります。
Dim inputDir
Dim zipFileName
Dim fso
Dim fileObj
Dim shellObj
Dim sourceFiles
'圧縮対象のファイルが入っているフォルダ
inputDir = "F:\vbs学習\20200519\backup"
'ZIPファイル名
zipFileName = "F:\vbs学習\20200519\test.zip"
'FileSystemObjectの作成
Set fso = CreateObject("Scripting.FileSystemObject")
'ZIPファイル作成
Set fileObj = fso.CreateTextFile(zipFileName, True)
' ヘッダの書き込み
fileObj.Write(Chr(80) & Chr(75) &Chr(5) & Chr(6) & String(18, 0))
fileObj.Close
'圧縮対象ファイルを作成したZIPファイル内に格納
Set shellObj = CreateObject("Shell.Application")
' 対象ファイル群を取得
Set sourceFiles = shellObj.NameSpace(inputDir).Items
' ZIPファイルに追加
shellObj.NameSpace(zipFileName).CopyHere(sourceFiles)
' 追加するまでウェイト
WScript.Sleep 3000
'圧縮完了のメッセージ
msgbox "圧縮が完了しました。"
ポイントになるのは以下の3つでした
- 空のzipファイルを先に作成
- zipファイルにはヘッダが必要
- 対象ファイルを後から格納
新しく出て来た処理の説明。
CreateObject(“Shell.Application”)
WindowsのShellアプリケーションを呼び出すオブジェクトです。
FileSystemObjectに続き2つ目のですね。
今回はzipファイルへ格納する処理をするのにこれを使っています。
ファイルコピーから圧縮までを合体
前回のファイルコピー処理と合体させて、圧縮までを1つの処理として実行する様にしてみました。
コードはこんな感じです。
Option Explicit
Dim strLogFile, objFSO, strLogMsg, objFile
strLogFile = "F:\vbs学習\20200519\log\sample.log"
Set objFSO = CreateObject("Scripting.FileSystemObject")
strLogMsg = "Script Start" : LogWrite(strLogMsg)
'****************************************************
'ファイルコピー
'****************************************************
'ファイルコピーで使う変数宣言
Dim objFileCopy
Dim strFileCopyFrom
Dim strFileCopyTo
Dim strFileNameDate
'ファイルリネーム用のタイムスタンプデータ作成
strFileNameDate = Date() & "_"
strFileNameDate = Replace(strFileNameDate, "/", "")
strFileNameDate = strFileNameDate & Right("0" & Hour(Now()) , 2)
strFileNameDate = strFileNameDate & Right("0" & Minute(Now()) , 2)
strFileNameDate = strFileNameDate & Right("0" & Second(Now()) , 2)
'ファイルシステムオブジェクト
Set objFileCopy = CreateObject("Scripting.FileSystemObject")
'コピー元ファイル
strFileCopyFrom = "F:\vbs学習\20200519\log\dummy.log"
'コピー先フォルダ
strFileCopyTo = "F:\vbs学習\20200519\backup\dummy_" & strFileNameDate & ".log"
'ファイルコピー処理
Call objFileCopy.CopyFile(strFileCopyFrom, strFileCopyTo, false)
'ファイルコピー実行ログ書き込み
strLogMsg = Err.Number & "_" & Err.Description : LogWrite(strLogMsg)
strLogMsg = strFileCopyTo : LogWrite(strLogMsg)
msgbox "コピーが完了しました。"
'****************************************************
'ファイルコピーEND
'****************************************************
'****************************************************
'ファイル圧縮
'****************************************************
Dim inputDir
Dim zipFileName
Dim fso
Dim fileObj
Dim shellObj
Dim sourceFiles
' 圧縮対象のファイルが入ったディレクトリ
inputDir = "F:\vbs学習\20200519\backup"
' ZIPファイル名
zipFileName = "F:\vbs学習\20200519\log\" & strFileNameDate & ".zip"
' FileSystemObjectの作成
Set fso = CreateObject("Scripting.FileSystemObject")
' ZIPファイルのオープン
Set fileObj = fso.CreateTextFile(zipFileName, True)
' ヘッダの書き込み
fileObj.Write(Chr(80) & Chr(75) &Chr(5) & Chr(6) & String(18, 0))
fileObj.Close
Set shellObj = CreateObject("Shell.Application")
' 対象ファイル群を取得
Set sourceFiles = shellObj.NameSpace(inputDir).Items
' ZIPファイルに追加
shellObj.NameSpace(zipFileName).CopyHere(sourceFiles)
' 追加するまでウェイト
WScript.Sleep 3000
strLogMsg = "圧縮完了" : LogWrite(strLogMsg)
strLogMsg = "圧縮ファイル:" & zipFileName : LogWrite(strLogMsg)
msgbox "圧縮が完了しました。"
'****************************************************
'ファイル圧縮END
'****************************************************
strLogMsg = "Script Stop" : LogWrite(strLogMsg)
WScript.Quit
'****************************************************
'ログ書き込み処理
'****************************************************
Function LogWrite(strMsg)
strMsg = "[" & FormatDateTime(Now, 0) & "]" & Space(1) & strMsg
Set objFile = objFSO.OpenTextFile(strLogFile,8,True,0)
objFile.WriteLine strMsg
objFile.Close
LogWrite =0
End Function
'****************************************************
'ログ書き込み処理END
'****************************************************
動作の流れとしては次の様な処理になります。
- F:\vbs学習\20200519\log\dummy.logをコピー
- F:\vbs学習\20200519\backup\へ
ファイル名dummy_yyyymmddHHMMSS.logで貼り付ける - F:\vbs学習\20200519\logフォルダにyyyymmddHHMMSS.zipを作成
- yyyymmddHHMMSS.zipにヘッダー情報を書き込む
- F:\vbs学習\20200519\backup\内のファイルを
yyyymmddHHMMSS.zipへ格納
本当は格納する対象をファイル1つだけ指定したかったのですが、今の状態だとフォルダ内全てを圧縮してしまいます。
回避方法として思いつくのは、ファイルをコピーして来る時に、タイムスタンプのフォルダーを新規で作成してそこに貼り付けるくらいですかね。
これならタイムスタンプのフォルダーを指定すればコピーした対象ファイルのみ圧縮できます。
あとがき
というわけで、今回はファイルの圧縮方法について調べてみました。
今回のまとめはこちら。
- 空のzipファイルを先に作成
- zipファイルにはヘッダが必要
- 対象ファイルを後から格納
プログラミング全般に言える事ですが、1つの言語で出来ない処理を、別の言語で実現させてつなぎ合わせるといった事が良くあるように感じます。
一つの言語にこだわらず、色々試してみると、問題解決の方法が見えてくる場合があるかもしれないと思いました。
今回は以上です。
次回もよろしくお願いします。

