Top > OOoBasic > Generic > Zip

Zip ファイル Edit

Zip ファイルを取り扱えます。zip ファイルが入れ子になっている場合にはエラーになります。

取り出しと仕舞込み Edit

Zip パッケージからファイル名指定で取り出し、保存する。

sZipURL: Zip パッケージの URL、sContentName: 取得するパッケージ内のファイル名、sOutURL: 保存先

Function GetZipContent( sZipURL As String, _
  sContentName As String, sOutURL As String )
  Dim oZipPkg As Object, oSFA As Object
  Dim oContentStream As Object, oInput As Object
  oZipPkg = CreateUnoService("com.sun.star.packages.Package")
  oZipPkg.initialize(array(sZipURL))
  If oZipPkg.hasByHierarchicalName(sContentName) Then
    oContentStream = oZipPkg.getByHierarchicalName(sContentName)
    oInput = oContentStream.getInputStream()
    oSFA = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
    oSFA.writeFile(sOutURL,oInput)
  End If
End Function

Zip ファイルにファイルを入れる。

sZipURL: Zip パッケージの URL、sContentName: パッケージ内でのファイル名、sInputURL: 入れるファイル URL、bCompress: 圧縮するかどうか

Function PutZipContent( sZipURL As String, _
 sContentName As String, sInputURL As String, Optional bCompress As Boolean )
 Dim oZipPkg As Object, oSFA As Object
 Dim oContentStream As Object, oZipFolder As Object
 oZipPkg = CreateUnoService("com.sun.star.packages.Package")
 oZipPkg.initialize(array(sZipURL))
 oZipFolder = oZipPkg.getByHierarchicalName("/")
 oContentStream = oZipPkg.createInstanceWithArguments(array(false))
 oSFA = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
 If oSFA.exists(sInputURL) Then
   oContentStream.setInputStream(oSFA.openFileRead(sInputURL))
   
   If IsMissing(bCompress) Then bCompress = True
   oContentStream.setPropertyValue("Compressed", bCompress)
   If NOT oZipFolder.hasByName(sContentName) Then
     oZipFolder.insertByName(sContentName,oContentStream)
   Else
     oZipFolder.replaceByName(sContentName,oContentStream)
   End If
   oZipPkg.commitChanges()
 End If
End Function

zip ファイル内でのファイル名は URL エンコードしてある必要があります。

 sPackageURL = "file:///C:/usr/test.zip"

 sOutputURL = "file:///C:/usr/txt.txt"
 GetZipContent(sPackageURL,"text.txt",sOutputURL)

 sInputURL = "file:///C:/usr/txt.txt"
 PutZipContent(sPackageURL,"Folder/text.txt,sInputURL)

com.sun.star.packages.Package サービスを利用するとパッケージにファイルを入れたときに manifest.xml ファイルが更新されてしまう。拡張機能の oxt ファイルにファイルを入れるのに使えない。

oContentStream の MediaType プロパティを設定すれば META-INF/manifest.xml ファイルに記載されるファイル形式を指定できます。また、Encrypted および EncryptionKey プロパティでファイルを暗号化して入れることができます。

空 Zip ファイル Edit

次のようにすると空の Zip ファイルが作成される。

Function CreateEmptyZip( sZipURL As String )
  Dim oZipPkg As Object, oSFA As Object
  oZipPkg = CreateUnoService("com.sun.star.packages.Package")
  oZipPkg.initialize(array(sZipURL))
  oZipFolder = oZipPkg.getByHierarchicalName("/")
  oZipPkg.commitChanges()
End Function

しかし、この方法で作成したファイルには mimetype ファイルが含まれる。

以下のようにすれば空の Zip ファイルが作成できる。

Sub CreateEmptyZipFile()
 sZipURL = "file:///C:/Users/Desktop/tt.zip"
 Const sEmptyZip = "504B0506000000000000000000000000000000000000"
 sTxt = sEmptyZip
 Dim nBytes(Int((Len(sTxt)/2) -1)) As Integer
 For i = 0 To UBound(nBytes)
   nInt = Int(CDec("&H" & Mid(sTxt,i*2 +1,2)))
   If nInt > 127 Then nInt = nInt - 256
   nBytes(i) = nInt
 Next i
 oPipe = CreateUnoService("com.sun.star.io.Pipe")
 oPipe.writeBytes(nBytes)
 oPipe.flush()
 oPipe.closeOutput()
 oSFA = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
 oSFA.writeFile(sZipURL,oPipe)
 oPipe.closeInput()
End Sub

取り出し専用サービス Edit

sub zipfileaccess
 sPackageURL = "file:///home/asuka/Desktop/test.zip"
 
 oZipAcc = CreateUnoService("com.sun.star.packages.zip.ZipFileAccess")
 oZipAcc.initialize(array(sPackageURL))
 
 sNames = oZipAcc.getElementNames()
 For i = 0 To UBOund(sNames) step 1
   oInput = oZipAcc.getByName(sNames(i))
   ' ...
   oInput.closeInput()
 Next
end sub

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes