ZGFileUtils.m 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. //
  2. // ZGFileUtils.m
  3. // GJTools
  4. //
  5. // Created by zhuge on 15/11/5.
  6. // Copyright (c) 2015年 zhuge. All rights reserved.
  7. //
  8. #import "ZGFileUtils.h"
  9. @implementation ZGFileUtils
  10. #pragma mark file reading
  11. +(NSArray*) readFileToLineArray:(NSString *)path {
  12. NSString *strs = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
  13. return [strs componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];
  14. }
  15. #pragma mark file operating
  16. +(BOOL)fileExist:(NSString*)filePath {
  17. return [[NSFileManager defaultManager] fileExistsAtPath:filePath];
  18. }
  19. +(BOOL)pathIsDirectory:(NSString*)path {
  20. BOOL isDir;
  21. if ([[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir]) {
  22. return isDir;
  23. }
  24. return NO;
  25. }
  26. +(void)createDirectoryIfNotExist:(NSString*)dir {
  27. NSFileManager *fm = [NSFileManager defaultManager];
  28. if (![fm fileExistsAtPath:dir]) {
  29. [fm createDirectoryAtPath:dir withIntermediateDirectories:YES attributes:nil error:nil];
  30. }
  31. }
  32. +(void)deleteFileOrDirectoryAtPath:(NSString*)path {
  33. if (![ZGFileUtils fileExist:path]) {
  34. return;
  35. }
  36. NSFileManager *fm = [NSFileManager defaultManager];
  37. NSError *err = nil;
  38. [fm removeItemAtPath:path error:&err];
  39. if (err) {
  40. NSLog(@"%@", [err localizedDescription]);
  41. }
  42. }
  43. +(void)cleanPath:(NSString *)path {
  44. [ZGFileUtils deleteFileOrDirectoryAtPath:path];
  45. [ZGFileUtils createDirectoryIfNotExist:path];
  46. }
  47. +(void)moveFileAtPath:(NSString *)filePath toPath:(NSString *)toPath {
  48. [ZGFileUtils createDirectoryIfNotExist:[toPath stringByDeletingLastPathComponent]];
  49. [ZGFileUtils execSync:@"/bin/mv" args:[NSArray arrayWithObjects:filePath, toPath, nil]];
  50. NSLog(@"%@ -----> %@", [filePath lastPathComponent], [toPath lastPathComponent]);
  51. }
  52. +(void)copyFileFromPath:(NSString *)fromPath toPath:(NSString*) toPath {
  53. [ZGFileUtils createDirectoryIfNotExist:[toPath stringByDeletingLastPathComponent]];
  54. [ZGFileUtils execSync:@"/bin/cp" args:@[@"-f", fromPath, toPath]];
  55. NSLog(@"File:%@ ---copy> %@", fromPath, toPath);
  56. }
  57. +(void)copyDirectoryFromPath:(NSString *)fromPath toPath:(NSString*) toPath {
  58. [ZGFileUtils createDirectoryIfNotExist:[toPath stringByDeletingLastPathComponent]];
  59. [ZGFileUtils execSync:@"/bin/cp" args:[NSArray arrayWithObjects:@"-rf", fromPath, toPath, nil]];
  60. NSLog(@"Dir:%@ --copy-->%@", fromPath, toPath);
  61. }
  62. +(void)replaceFileContentAtPath:(NSString*)path withDictionary:(NSDictionary*)dic {
  63. //sort first
  64. NSArray *sortedKeys = [[[[dic allKeys] sortedArrayUsingSelector: @selector(compare:)] reverseObjectEnumerator] allObjects];
  65. NSError *err = nil;
  66. NSString *fileString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&err];
  67. if (err) {
  68. NSLog(@"%@", [err localizedDescription]);
  69. }
  70. BOOL isReplaced = NO;
  71. for (NSString *key in sortedKeys) {
  72. NSString *value = [dic objectForKey:key];
  73. if ([fileString rangeOfString:key].location != NSNotFound) {
  74. isReplaced = YES;
  75. fileString = [fileString stringByReplacingOccurrencesOfString:key withString:value];
  76. }
  77. }
  78. if (isReplaced) {
  79. NSLog(@"File:%@ is replaced", [path lastPathComponent]);
  80. [fileString writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
  81. }
  82. }
  83. +(NSArray*) directorysAtDirNoRecursion:(NSString*)directory {
  84. NSMutableArray *retArray = [NSMutableArray arrayWithCapacity:0];
  85. NSArray *fileArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directory error:nil];
  86. for (NSString *name in fileArray) {
  87. NSString *fileName = [NSString stringWithFormat:@"%@/%@", directory, name];
  88. if ([ZGFileUtils pathIsDirectory:fileName] && ![name hasPrefix:@"."]) {
  89. [retArray addObject:fileName];
  90. }
  91. }
  92. return retArray;
  93. }
  94. +(NSArray*) directorysAtDirRecursion:(NSString*)directory filterArray:(NSArray*)filterArray {
  95. NSMutableArray *retArray = [NSMutableArray arrayWithCapacity:0];
  96. NSArray *fileArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directory error:nil];
  97. for (NSString *name in fileArray) {
  98. NSString *fileName = [NSString stringWithFormat:@"%@/%@", directory, name];
  99. if ([ZGFileUtils pathIsDirectory:fileName]) {
  100. NSArray *inArray = [ZGFileUtils directorysAtDirRecursion:fileName filterArray:filterArray];
  101. [retArray addObjectsFromArray:inArray];
  102. if ([filterArray containsObject:name]) {
  103. [retArray addObject:fileName];
  104. }
  105. }
  106. }
  107. return retArray;
  108. }
  109. +(NSArray*) arrayOfFileAtDirRecursion:(NSString*)directory {
  110. NSMutableArray *retArray = [NSMutableArray arrayWithCapacity:0];
  111. NSArray *fileArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directory error:nil];
  112. for (int i = 0; i < [fileArray count]; i++) {
  113. if ([@".DS_Store" isEqualToString:fileArray[i]]) {
  114. continue;
  115. }
  116. NSString *fileName = [NSString stringWithFormat:@"%@/%@", directory, [fileArray objectAtIndex:i]];
  117. if (![ZGFileUtils pathIsDirectory:fileName]) {
  118. [retArray addObject:fileName];
  119. } else {
  120. [retArray addObjectsFromArray:[ZGFileUtils arrayOfFileAtDirRecursion:fileName]];
  121. }
  122. }
  123. return retArray;
  124. }
  125. +(NSArray*) arrayOfFileAtDir:(NSString*)directory extensionFilterArray:(NSArray*)extensionFilterArray {
  126. NSMutableArray *retArray = [NSMutableArray arrayWithCapacity:0];
  127. NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directory error:nil];
  128. for (NSString *file in files) {
  129. if ([@".DS_Store" isEqualToString:file]) {
  130. continue;
  131. }
  132. NSString *fileName = [NSString stringWithFormat:@"%@/%@", directory, file];
  133. if (![ZGFileUtils pathIsDirectory:fileName]) {
  134. NSString *ext = [fileName pathExtension];
  135. if ([extensionFilterArray containsObject:ext]) {
  136. [retArray addObject:fileName];
  137. }
  138. }
  139. }
  140. return retArray;
  141. }
  142. +(NSArray*) arrayOfFileAtDirRecursion:(NSString*)directory extensionFilterArray:(NSArray*)extensionFilterArray {
  143. NSMutableArray *retArray = [NSMutableArray arrayWithCapacity:0];
  144. NSArray *fileArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directory error:nil];
  145. for (int i = 0; i < [fileArray count]; i++) {
  146. NSString *fileName = [NSString stringWithFormat:@"%@/%@", directory, [fileArray objectAtIndex:i]];
  147. if (![ZGFileUtils pathIsDirectory:fileName]) {
  148. NSString *extension = [fileName pathExtension];
  149. if ([extensionFilterArray containsObject:extension]) {
  150. [retArray addObject:fileName];
  151. }
  152. } else {
  153. [retArray addObjectsFromArray:[ZGFileUtils arrayOfFileAtDirRecursion:fileName extensionFilterArray:extensionFilterArray]];
  154. }
  155. }
  156. return retArray;
  157. }
  158. +(NSArray*) arrayOfFileAtDirRecursion:(NSString*)directory extensionFilterArray:(NSArray*)extensionFilterArray ignorePaths:(NSArray *)ignorePaths {
  159. NSMutableArray *retArray = [NSMutableArray arrayWithCapacity:0];
  160. NSArray *fileArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directory error:nil];
  161. for (int i = 0; i < [fileArray count]; i++) {
  162. NSString *fileName = [NSString stringWithFormat:@"%@/%@", directory, [fileArray objectAtIndex:i]];
  163. if (![ZGFileUtils pathIsDirectory:fileName]) {
  164. BOOL needAdd = true;
  165. NSString *extension = [fileName pathExtension];
  166. if (![extensionFilterArray containsObject:extension]) {
  167. needAdd = false;
  168. }
  169. if (needAdd) {
  170. for (NSString *ignorePath in ignorePaths) {
  171. if ([fileName rangeOfString:ignorePath].location != NSNotFound) {
  172. needAdd = false;
  173. }
  174. }
  175. }
  176. if (needAdd) {
  177. [retArray addObject:fileName];
  178. }
  179. } else {
  180. [retArray addObjectsFromArray:[ZGFileUtils arrayOfFileAtDirRecursion:fileName extensionFilterArray:extensionFilterArray ignorePaths:ignorePaths]];
  181. }
  182. }
  183. return retArray;
  184. }
  185. +(NSArray*) filesInDirectory:(NSString *)directory fileNameWithoutExtension:(NSString*)fileNameWithoutExtension {
  186. NSMutableArray *retArray = [NSMutableArray arrayWithCapacity:0];
  187. NSArray *fileArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directory error:nil];
  188. for (int i = 0; i < [fileArray count]; i++) {
  189. NSString *fileName = [NSString stringWithFormat:@"%@/%@", directory, [fileArray objectAtIndex:i]];
  190. if (![ZGFileUtils pathIsDirectory:fileName]) {
  191. NSString *got = [[fileName lastPathComponent] stringByDeletingPathExtension];
  192. if ([fileNameWithoutExtension isEqualToString:got]) {
  193. [retArray addObject:fileName];
  194. }
  195. } else {
  196. [retArray addObjectsFromArray:[ZGFileUtils filesInDirectory:fileName fileNameWithoutExtension:fileNameWithoutExtension]];
  197. }
  198. }
  199. return retArray;
  200. }
  201. +(void) zipDirectory:(NSString*)directory {
  202. NSString *parentPath = [directory stringByDeletingLastPathComponent];
  203. NSString *folderName = [directory lastPathComponent];
  204. NSString *toPath = [NSString stringWithFormat:@"%@/%@.zip", parentPath, folderName];
  205. [ZGFileUtils zipDirectory:directory toPath:toPath];
  206. }
  207. +(void) zipDirectory:(NSString *)directory toPath:(NSString *)toPath {
  208. [ZGFileUtils deleteFileOrDirectoryAtPath:toPath];
  209. NSArray *args = @[@"-r", toPath, [directory lastPathComponent]];
  210. NSTask *task = [[NSTask alloc] init];
  211. [task setCurrentDirectoryPath:[directory stringByDeletingLastPathComponent]];
  212. [task setLaunchPath:@"/usr/bin/zip"];
  213. [task setArguments:args];
  214. [task launch];
  215. [task waitUntilExit];
  216. }
  217. #pragma mark private methods
  218. +(void)execSync:(NSString *)cmd args:(NSArray *)args {
  219. NSTask *currentTask = [[NSTask alloc] init];
  220. [currentTask setLaunchPath:cmd];
  221. NSMutableDictionary *environmentDict = [NSMutableDictionary dictionaryWithDictionary:[[NSProcessInfo processInfo] environment]];
  222. NSString *path = [environmentDict objectForKey:@"PATH"];
  223. [environmentDict setValue:path forKey:@"PATH"];
  224. [currentTask setEnvironment:environmentDict];
  225. // Set arguments
  226. [currentTask setArguments:args];
  227. // set input
  228. [currentTask launch];
  229. [currentTask waitUntilExit];
  230. }
  231. @end