// // ZGFileUtils.m // GJTools // // Created by zhuge on 15/11/5. // Copyright (c) 2015年 zhuge. All rights reserved. // #import "ZGFileUtils.h" @implementation ZGFileUtils #pragma mark file reading +(NSArray*) readFileToLineArray:(NSString *)path { NSString *strs = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; return [strs componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; } #pragma mark file operating +(BOOL)fileExist:(NSString*)filePath { return [[NSFileManager defaultManager] fileExistsAtPath:filePath]; } +(BOOL)pathIsDirectory:(NSString*)path { BOOL isDir; if ([[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir]) { return isDir; } return NO; } +(void)createDirectoryIfNotExist:(NSString*)dir { NSFileManager *fm = [NSFileManager defaultManager]; if (![fm fileExistsAtPath:dir]) { [fm createDirectoryAtPath:dir withIntermediateDirectories:YES attributes:nil error:nil]; } } +(void)deleteFileOrDirectoryAtPath:(NSString*)path { if (![ZGFileUtils fileExist:path]) { return; } NSFileManager *fm = [NSFileManager defaultManager]; NSError *err = nil; [fm removeItemAtPath:path error:&err]; if (err) { NSLog(@"%@", [err localizedDescription]); } } +(void)cleanPath:(NSString *)path { [ZGFileUtils deleteFileOrDirectoryAtPath:path]; [ZGFileUtils createDirectoryIfNotExist:path]; } +(void)moveFileAtPath:(NSString *)filePath toPath:(NSString *)toPath { [ZGFileUtils createDirectoryIfNotExist:[toPath stringByDeletingLastPathComponent]]; [ZGFileUtils execSync:@"/bin/mv" args:[NSArray arrayWithObjects:filePath, toPath, nil]]; NSLog(@"%@ -----> %@", [filePath lastPathComponent], [toPath lastPathComponent]); } +(void)copyFileFromPath:(NSString *)fromPath toPath:(NSString*) toPath { [ZGFileUtils createDirectoryIfNotExist:[toPath stringByDeletingLastPathComponent]]; [ZGFileUtils execSync:@"/bin/cp" args:@[@"-f", fromPath, toPath]]; NSLog(@"File:%@ ---copy> %@", fromPath, toPath); } +(void)copyDirectoryFromPath:(NSString *)fromPath toPath:(NSString*) toPath { [ZGFileUtils createDirectoryIfNotExist:[toPath stringByDeletingLastPathComponent]]; [ZGFileUtils execSync:@"/bin/cp" args:[NSArray arrayWithObjects:@"-rf", fromPath, toPath, nil]]; NSLog(@"Dir:%@ --copy-->%@", fromPath, toPath); } +(void)replaceFileContentAtPath:(NSString*)path withDictionary:(NSDictionary*)dic { //sort first NSArray *sortedKeys = [[[[dic allKeys] sortedArrayUsingSelector: @selector(compare:)] reverseObjectEnumerator] allObjects]; NSError *err = nil; NSString *fileString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&err]; if (err) { NSLog(@"%@", [err localizedDescription]); } BOOL isReplaced = NO; for (NSString *key in sortedKeys) { NSString *value = [dic objectForKey:key]; if ([fileString rangeOfString:key].location != NSNotFound) { isReplaced = YES; fileString = [fileString stringByReplacingOccurrencesOfString:key withString:value]; } } if (isReplaced) { NSLog(@"File:%@ is replaced", [path lastPathComponent]); [fileString writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil]; } } +(NSArray*) directorysAtDirNoRecursion:(NSString*)directory { NSMutableArray *retArray = [NSMutableArray arrayWithCapacity:0]; NSArray *fileArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directory error:nil]; for (NSString *name in fileArray) { NSString *fileName = [NSString stringWithFormat:@"%@/%@", directory, name]; if ([ZGFileUtils pathIsDirectory:fileName] && ![name hasPrefix:@"."]) { [retArray addObject:fileName]; } } return retArray; } +(NSArray*) directorysAtDirRecursion:(NSString*)directory filterArray:(NSArray*)filterArray { NSMutableArray *retArray = [NSMutableArray arrayWithCapacity:0]; NSArray *fileArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directory error:nil]; for (NSString *name in fileArray) { NSString *fileName = [NSString stringWithFormat:@"%@/%@", directory, name]; if ([ZGFileUtils pathIsDirectory:fileName]) { NSArray *inArray = [ZGFileUtils directorysAtDirRecursion:fileName filterArray:filterArray]; [retArray addObjectsFromArray:inArray]; if ([filterArray containsObject:name]) { [retArray addObject:fileName]; } } } return retArray; } +(NSArray*) arrayOfFileAtDirRecursion:(NSString*)directory { NSMutableArray *retArray = [NSMutableArray arrayWithCapacity:0]; NSArray *fileArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directory error:nil]; for (int i = 0; i < [fileArray count]; i++) { if ([@".DS_Store" isEqualToString:fileArray[i]]) { continue; } NSString *fileName = [NSString stringWithFormat:@"%@/%@", directory, [fileArray objectAtIndex:i]]; if (![ZGFileUtils pathIsDirectory:fileName]) { [retArray addObject:fileName]; } else { [retArray addObjectsFromArray:[ZGFileUtils arrayOfFileAtDirRecursion:fileName]]; } } return retArray; } +(NSArray*) arrayOfFileAtDir:(NSString*)directory extensionFilterArray:(NSArray*)extensionFilterArray { NSMutableArray *retArray = [NSMutableArray arrayWithCapacity:0]; NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directory error:nil]; for (NSString *file in files) { if ([@".DS_Store" isEqualToString:file]) { continue; } NSString *fileName = [NSString stringWithFormat:@"%@/%@", directory, file]; if (![ZGFileUtils pathIsDirectory:fileName]) { NSString *ext = [fileName pathExtension]; if ([extensionFilterArray containsObject:ext]) { [retArray addObject:fileName]; } } } return retArray; } +(NSArray*) arrayOfFileAtDirRecursion:(NSString*)directory extensionFilterArray:(NSArray*)extensionFilterArray { NSMutableArray *retArray = [NSMutableArray arrayWithCapacity:0]; NSArray *fileArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directory error:nil]; for (int i = 0; i < [fileArray count]; i++) { NSString *fileName = [NSString stringWithFormat:@"%@/%@", directory, [fileArray objectAtIndex:i]]; if (![ZGFileUtils pathIsDirectory:fileName]) { NSString *extension = [fileName pathExtension]; if ([extensionFilterArray containsObject:extension]) { [retArray addObject:fileName]; } } else { [retArray addObjectsFromArray:[ZGFileUtils arrayOfFileAtDirRecursion:fileName extensionFilterArray:extensionFilterArray]]; } } return retArray; } +(NSArray*) arrayOfFileAtDirRecursion:(NSString*)directory extensionFilterArray:(NSArray*)extensionFilterArray ignorePaths:(NSArray *)ignorePaths { NSMutableArray *retArray = [NSMutableArray arrayWithCapacity:0]; NSArray *fileArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directory error:nil]; for (int i = 0; i < [fileArray count]; i++) { NSString *fileName = [NSString stringWithFormat:@"%@/%@", directory, [fileArray objectAtIndex:i]]; if (![ZGFileUtils pathIsDirectory:fileName]) { BOOL needAdd = true; NSString *extension = [fileName pathExtension]; if (![extensionFilterArray containsObject:extension]) { needAdd = false; } if (needAdd) { for (NSString *ignorePath in ignorePaths) { if ([fileName rangeOfString:ignorePath].location != NSNotFound) { needAdd = false; } } } if (needAdd) { [retArray addObject:fileName]; } } else { [retArray addObjectsFromArray:[ZGFileUtils arrayOfFileAtDirRecursion:fileName extensionFilterArray:extensionFilterArray ignorePaths:ignorePaths]]; } } return retArray; } +(NSArray*) filesInDirectory:(NSString *)directory fileNameWithoutExtension:(NSString*)fileNameWithoutExtension { NSMutableArray *retArray = [NSMutableArray arrayWithCapacity:0]; NSArray *fileArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directory error:nil]; for (int i = 0; i < [fileArray count]; i++) { NSString *fileName = [NSString stringWithFormat:@"%@/%@", directory, [fileArray objectAtIndex:i]]; if (![ZGFileUtils pathIsDirectory:fileName]) { NSString *got = [[fileName lastPathComponent] stringByDeletingPathExtension]; if ([fileNameWithoutExtension isEqualToString:got]) { [retArray addObject:fileName]; } } else { [retArray addObjectsFromArray:[ZGFileUtils filesInDirectory:fileName fileNameWithoutExtension:fileNameWithoutExtension]]; } } return retArray; } +(void) zipDirectory:(NSString*)directory { NSString *parentPath = [directory stringByDeletingLastPathComponent]; NSString *folderName = [directory lastPathComponent]; NSString *toPath = [NSString stringWithFormat:@"%@/%@.zip", parentPath, folderName]; [ZGFileUtils zipDirectory:directory toPath:toPath]; } +(void) zipDirectory:(NSString *)directory toPath:(NSString *)toPath { [ZGFileUtils deleteFileOrDirectoryAtPath:toPath]; NSArray *args = @[@"-r", toPath, [directory lastPathComponent]]; NSTask *task = [[NSTask alloc] init]; [task setCurrentDirectoryPath:[directory stringByDeletingLastPathComponent]]; [task setLaunchPath:@"/usr/bin/zip"]; [task setArguments:args]; [task launch]; [task waitUntilExit]; } #pragma mark private methods +(void)execSync:(NSString *)cmd args:(NSArray *)args { NSTask *currentTask = [[NSTask alloc] init]; [currentTask setLaunchPath:cmd]; NSMutableDictionary *environmentDict = [NSMutableDictionary dictionaryWithDictionary:[[NSProcessInfo processInfo] environment]]; NSString *path = [environmentDict objectForKey:@"PATH"]; [environmentDict setValue:path forKey:@"PATH"]; [currentTask setEnvironment:environmentDict]; // Set arguments [currentTask setArguments:args]; // set input [currentTask launch]; [currentTask waitUntilExit]; } @end