VBAからVB.NETに焼き直し。
MakeZIP.exe ZIPファイル ファイル...
vbc MakeZIP.VB
Option Explicit
Imports Microsoft.VisualBasic
Imports System
Imports System.IO
Imports System.Windows.Forms
Public Class Zip
Public Shared Function Main(ByVal Arguments() As String) As Integer
If Arguments.Length<2 Then
Console.Error.WriteLine("Arguments Missing.")
Console.Error.WriteLine("Usage: MakeZip zipfile files...")
Return 1
End If
If Path.GetExtension(Arguments(0).ToLower()) <> ".zip" Then
Console.Error.WriteLine("Invalid Extension Name - " & Arguments(0))
Return 1
End If
If Not File.Exists(Arguments(0)) Then
Dim fs As FileStream = File.Create(Arguments(0))
Dim b As Byte() = {&H50, &H4B, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
fs.Write(b,0,b.Length)
fs.Close()
End If
Dim Shell As Object = CreateObject("Shell.Application")
Dim zFolder As Object = Shell.NameSpace(Path.GetFullPath(Arguments(0)))
Dim k As Integer
For k = 1 To Arguments.Length-1
Dim FileName As String = Path.GetFileName(Arguments(k))
Dim sFolderItem As Object = Shell.NameSpace(Path.GetFullPath(Arguments(k) & "\..")).ParseName(FileName)
If sFolderItem Is Nothing Then
Console.Error.WriteLine("File Not Found. - " & Arguments(k))
Return 1
End If
Do
Dim zFolderItem As Object = zFolder.ParseName(FileName)
If zFolderItem Is Nothing Then
Dim Count As Integer = zFolder.Items().Count
zFolder.CopyHere(sFolderItem)
Do While zFolder.Items().Count =< Count
Threading.Thread.Sleep(1000)
Loop
Exit Do
Else
Dim Ans As Integer = MessageBox.Show("このフォルダには既に次のファイルが存在します:" & ControlChars.Lf & ControlChars.Lf & _
"""" & FileName & """" & ControlChars.Lf & ControlChars.Lf & "既存のファイルと置き換えますか?", "ファイル置換の確認", _
MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)
Select Case Ans
Case DialogResult.Yes
zFolderItem.InvokeVerb("delete")
Case DialogResult.No
Exit Do
Case DialogResult.Cancel
Exit For
End Select
End If
Loop
Next
End Function
End Class
ZIP圧縮のFolder.CopyHere()は非同期なので、Folder.Items().Countの変化を捕らえて、待ち合わせます。
置換では、変化しないので、削除して、追加します。