zipfile.monkey2 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. Namespace std.zipfile
  2. Using miniz
  3. #rem monkeydoc The ZipFile class.
  4. #end
  5. Class ZipFile
  6. #rem monkeydoc Array of all files contained in the zip.
  7. #end
  8. Property Files:String[]()
  9. Return _files
  10. End
  11. #rem monkeydoc Closes the zip.
  12. #end
  13. Method Close()
  14. If Not _data Return
  15. libc.free( _zip )
  16. _files=Null
  17. _sizes=Null
  18. _data.Discard()
  19. _data=Null
  20. End
  21. #rem monkeydoc Checks if a file is contained in the zip.
  22. #end
  23. Method Contains:Bool( file:String )
  24. Return FindFile( file )<>-1
  25. End
  26. #rem moneydoc Extracts a file from the zip into a databuffer.
  27. #end
  28. Method ExtractData:DataBuffer( file:String )
  29. Local i:=FindFile( file )
  30. If i=-1 Return Null
  31. Local size:=_sizes[i]
  32. Local buf:=New DataBuffer( size )
  33. If mz_zip_reader_extract_to_mem( _zip,i,buf.Data,size,0 ) Return buf
  34. buf.Discard()
  35. Return Null
  36. End
  37. #rem monkeydoc @hidden
  38. #end
  39. Method FindFile:Int( file:String )
  40. For Local i:=0 Until _files.Length
  41. If file=_files[i] Return i
  42. Next
  43. Return -1
  44. End
  45. #rem monkeydoc @hidden
  46. #end
  47. Method Extract:Bool( dir:String,prefix:String="" )
  48. If Not dir.EndsWith( "/" ) dir+="/"
  49. Local result:=True
  50. For Local i:=0 Until _files.Length
  51. Local name:=_files[i]
  52. If Not name Continue
  53. If prefix And Not name.StartsWith( prefix ) Continue
  54. Local size:=_sizes[i]
  55. Local buf:=New DataBuffer( size )
  56. If mz_zip_reader_extract_to_mem( _zip,i,buf.Data,size,0 )
  57. Local path:=dir+name
  58. filesystem.CreateDir( ExtractDir( path ) )
  59. buf.Save( path )
  60. Else
  61. result=False
  62. Endif
  63. buf.Discard()
  64. Next
  65. Return result
  66. End
  67. Function Open:ZipFile( path:String )
  68. Local data:=DataBuffer.Load( path )
  69. If Not data Return Null
  70. Local zip:mz_zip_archive Ptr
  71. zip=Cast<mz_zip_archive Ptr>( libc.malloc( sizeof( zip[0] ) ) )
  72. memset( zip,0,sizeof( zip[0] ) )
  73. If Not mz_zip_reader_init_mem( zip,data.Data,data.Length,0 )
  74. free( zip )
  75. data.Discard()
  76. Return Null
  77. Endif
  78. Return New ZipFile( data,zip )
  79. End
  80. Private
  81. Field _data:DataBuffer
  82. Field _zip:mz_zip_archive Ptr
  83. Field _files:String[]
  84. Field _sizes:Int[]
  85. Method New( data:DataBuffer,zip:mz_zip_archive Ptr )
  86. _data=data
  87. _zip=zip
  88. Local nfiles:=mz_zip_reader_get_num_files( _zip )
  89. _files=New String[nfiles]
  90. _sizes=New Int[nfiles]
  91. For Local i:=0 Until nfiles
  92. Local stat:mz_zip_archive_file_stat
  93. If Not mz_zip_reader_file_stat( zip,i,Varptr stat ) Continue
  94. _files[i]=String.FromCString( stat.m_filename )
  95. _sizes[i]=stat.m_uncomp_size
  96. Next
  97. End
  98. End
  99. #rem monkeydoc Extracts a zip file to a directory.
  100. @param zipFile File path of zipfile to extract.
  101. @param dstDir Directory to extract zip file to.
  102. @return True if successful.
  103. #end
  104. Function ExtractZip:Bool( zipFile:String,dstDir:String )
  105. Return ExtractZip( zipFile,dstDir )
  106. End
  107. #rem monkeydoc @hidden
  108. #end
  109. Function ExtractZip:Bool( zipFile:String,dstDir:String,prefix:String )
  110. Local zip:=ZipFile.Open( zipFile )
  111. If Not zip Return False
  112. Local result:=zip.Extract( dstDir,prefix )
  113. zip.Close()
  114. Return result
  115. End