zipfile.monkey2 2.4 KB

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