RAArchiver.m 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. //
  2. // JKLArchiver.m
  3. // ZipArchiver
  4. //
  5. // Created by Jack on 2018/11/7.
  6. // Copyright © 2018年 USAI. All rights reserved.
  7. //
  8. #import "RAArchiver.h"
  9. #import "ZipArchive.h"
  10. @implementation RAArchiver
  11. /**
  12. * @brief 解压离线下载的压缩包
  13. * @param path 待解压文件路径
  14. * @param to 解压至目标文件夹
  15. * @param password 解压密码,可为空
  16. * @return 解压是否成功
  17. */
  18. + (BOOL)ra_unzipOfflineZip:(NSString *)path toDir:(NSString *)to withPassword:(NSString *)password {
  19. ZipArchive *zip = [[ZipArchive alloc] init];
  20. BOOL zipRes = NO;
  21. if (password) {
  22. zipRes = [zip UnzipOpenFile:path Password:password];
  23. } else {
  24. zipRes = [zip UnzipOpenFile:path];
  25. }
  26. if (zipRes) {
  27. zipRes = [zip UnzipFileTo:to overWrite:YES];
  28. }
  29. [zip UnzipCloseFile];
  30. return zipRes;
  31. }
  32. /**
  33. * @brief 压缩文件/文件夹
  34. * @param file 被压缩文件/文件夹
  35. * @param password 压缩密码,可谓空
  36. * @return 压缩是否成功
  37. */
  38. + (BOOL)ra_zipFile:(NSString *)file withPassword:(NSString *)password {
  39. if (file.length == 0) {
  40. return NO;
  41. }
  42. NSFileManager *fm = [NSFileManager defaultManager];
  43. BOOL isDir = NO;
  44. if ([fm fileExistsAtPath:file isDirectory:&isDir]) {
  45. NSString *zipFile = [file stringByAppendingPathExtension:@"zip"];
  46. ZipArchive *zip = [[ZipArchive alloc] init];
  47. if (password) {
  48. [zip CreateZipFile2:zipFile Password:password];
  49. } else {
  50. [zip CreateZipFile2:zipFile];
  51. }
  52. NSString *name = file.lastPathComponent;
  53. if (isDir) {
  54. NSArray<NSString *> *subPathArr = [fm subpathsAtPath:file];
  55. [subPathArr enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  56. NSString *subPath = [file stringByAppendingPathComponent:obj];
  57. BOOL subPathIsDir = NO;
  58. if ([fm fileExistsAtPath:subPath isDirectory:&subPathIsDir] && !subPathIsDir) {
  59. [zip addFileToZip:subPath newname:[name stringByAppendingPathComponent:obj]];
  60. }
  61. }];
  62. } else {
  63. [zip addFileToZip:file newname:name];
  64. }
  65. [zip CloseZipFile2];
  66. return YES;
  67. }
  68. return NO;
  69. }
  70. /**
  71. * @brief 压缩文件/文件夹
  72. * @param files 被压缩文件/文件夹路径 数组
  73. * @param path 压缩文件存放路径
  74. * @param password 压缩密码,可谓空
  75. * @return 压缩是否成功
  76. */
  77. + (BOOL)ra_zipFiles:(NSArray<NSString *> *)files toPath:(NSString *)path withPassword:(NSString *)password {
  78. if (files == nil || files.count == 0 || path == nil) {
  79. return NO;
  80. }
  81. NSFileManager *fm = [NSFileManager defaultManager];
  82. NSString *parent = [path stringByDeletingLastPathComponent];
  83. BOOL isParentDir = NO;
  84. if ([fm fileExistsAtPath:parent isDirectory:&isParentDir] && isParentDir) {
  85. } else {
  86. NSError *err = nil;
  87. [fm createDirectoryAtPath:parent withIntermediateDirectories:YES attributes:nil error:&err];
  88. if (err) {
  89. NSLog(@"error: %@",err);
  90. return NO;
  91. }
  92. }
  93. BOOL isDir = NO;
  94. if ([fm fileExistsAtPath:path isDirectory:&isDir] && !isDir) {
  95. NSError *err = nil;
  96. [fm removeItemAtPath:path error:&err];
  97. if (err) {
  98. NSLog(@"error: %@",err);
  99. return NO;
  100. }
  101. }
  102. ZipArchive *zip = [[ZipArchive alloc] init];
  103. if (password) {
  104. [zip CreateZipFile2:path Password:password];
  105. } else {
  106. [zip CreateZipFile2:path];
  107. }
  108. [files enumerateObjectsUsingBlock:^(NSString * _Nonnull file, NSUInteger idx, BOOL * _Nonnull stop) {
  109. BOOL isDir = NO;
  110. if ([fm fileExistsAtPath:file isDirectory:&isDir]) {
  111. NSString *name = file.lastPathComponent;
  112. if (isDir) {
  113. NSArray<NSString *> *subPathArr = [fm subpathsAtPath:file];
  114. [subPathArr enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  115. NSString *subPath = [file stringByAppendingPathComponent:obj];
  116. BOOL subPathIsDir = NO;
  117. if ([fm fileExistsAtPath:subPath isDirectory:&subPathIsDir] && !subPathIsDir) {
  118. [zip addFileToZip:subPath newname:[name stringByAppendingPathComponent:obj]];
  119. }
  120. }];
  121. } else {
  122. [zip addFileToZip:file newname:name];
  123. }
  124. }
  125. }];
  126. [zip CloseZipFile2];
  127. return YES;
  128. }
  129. @end