« VBAでZIP圧縮する。 | トップページ | バッチファイルやスクリプトからシフトキー類の押し下げ状態を調べる。(その2) »

2007年11月21日 (水)

VB.NETでZIP圧縮コマンドを作る。

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の変化を捕らえて、待ち合わせます。
置換では、変化しないので、削除して、追加します。

« VBAでZIP圧縮する。 | トップページ | バッチファイルやスクリプトからシフトキー類の押し下げ状態を調べる。(その2) »