zipfile.monkey2 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  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 path:=dir+name
  55. If mz_zip_reader_is_file_a_directory( _zip,i )
  56. filesystem.CreateDir( path )
  57. Continue
  58. Endif
  59. Local size:=_sizes[i]
  60. Local buf:=New DataBuffer( size )
  61. If mz_zip_reader_extract_to_mem( _zip,i,buf.Data,size,0 )
  62. filesystem.CreateDir( ExtractDir( path ) )
  63. buf.Save( path )
  64. Else
  65. result=False
  66. Endif
  67. buf.Discard()
  68. Next
  69. Return result
  70. End
  71. Function Open:ZipFile( path:String )
  72. Local data:=DataBuffer.Load( path )
  73. If Not data Return Null
  74. Local zip:mz_zip_archive Ptr
  75. zip=Cast<mz_zip_archive Ptr>( libc.malloc( sizeof( zip[0] ) ) )
  76. memset( zip,0,sizeof( zip[0] ) )
  77. If Not mz_zip_reader_init_mem( zip,data.Data,data.Length,0 )
  78. free( zip )
  79. data.Discard()
  80. Return Null
  81. Endif
  82. Return New ZipFile( data,zip )
  83. End
  84. Private
  85. Field _data:DataBuffer
  86. Field _zip:mz_zip_archive Ptr
  87. Field _files:String[]
  88. Field _sizes:Int[]
  89. Method New( data:DataBuffer,zip:mz_zip_archive Ptr )
  90. _data=data
  91. _zip=zip
  92. Local nfiles:=mz_zip_reader_get_num_files( _zip )
  93. _files=New String[nfiles]
  94. _sizes=New Int[nfiles]
  95. For Local i:=0 Until nfiles
  96. Local stat:mz_zip_archive_file_stat
  97. If Not mz_zip_reader_file_stat( zip,i,Varptr stat ) Continue
  98. _files[i]=String.FromCString( stat.m_filename )
  99. _sizes[i]=stat.m_uncomp_size
  100. Next
  101. End
  102. End
  103. #rem monkeydoc Extracts a zip file to a directory.
  104. @param zipFile File path of zipfile to extract.
  105. @param dstDir Directory to extract zip file to.
  106. @return True if successful.
  107. #end
  108. Function ExtractZip:Bool( zipFile:String,dstDir:String )
  109. Return ExtractZip( zipFile,dstDir,"" )
  110. End
  111. #rem monkeydoc @hidden
  112. #end
  113. Function ExtractZip:Bool( zipFile:String,dstDir:String,prefix:String )
  114. Local zip:=ZipFile.Open( zipFile )
  115. If Not zip Return False
  116. Local result:=zip.Extract( dstDir,prefix )
  117. zip.Close()
  118. Return result
  119. End