最近无意中发现工程中有许多没有用到的图片,这些图片导致了工程的体积庞大,因此想将这些没有用到的图片找出来并将其删除。开始是通过人肉手动删除,删除花费了很长的时间,但这样做能够确保准确无误。后来想换一种方式删除图片,这种方式就是写个程序删除多余的图片。下面谈一谈整体思路。
首先,将工程中的所有文件包括文件夹下的文件全部找出来,用一个数组保存这些路径。
其次,通过Assets(我一般将图片存放在这个文件中)找出所有的图片,并将这些图片的地址保存起来。
然后,将所有的.m文件找出并且找出所有的图片。在寻找图片的时候,我发现了一个问题,一般添加图片的方法是通过imageNamed:@"",但是有时候我们会通过变量添加图片,这时候这种方式就不能够找到所有的图片。但目前对我而言只能找到通过这种方式使用的图片名,以后有机会我将完善这个程序,争取能够找出所有使用的图片。
最后,比较两个存放图片名的数组,找出没有使用的图片名。
下面是源码,有需要的可以看看。
1 #import "LMFFindAllFile.h" 2 3 @implementation LMFFindAllFile 4 #pragma mark --返回所有的文件列表 5 + (NSArray *)findAllFileWithFileName:(NSString *)fileName 6 { 7 NSArray *fileNameListArray; 8 NSFileManager *fileManager = [NSFileManager defaultManager]; 9 //判断文件是否存在 10 if ([fileManager fileExistsAtPath:fileName]) 11 { 12 NSError *error = nil; 13 fileNameListArray = [fileManager subpathsOfDirectoryAtPath:fileName error:&error]; 14 } 15 return fileNameListArray; 16 } 17 @end
1 #import "LMFFindAllPicture.h" 2 3 @implementation LMFFindAllPicture 4 #pragma mark --找出所有的图片的路径并将其保存在一个数组中 5 + (NSArray *)findAllPicture:(NSArray *)fileNameList 6 { 7 NSMutableArray *fileNameArray = [NSMutableArray array]; 8 NSMutableArray *filePathArray = [NSMutableArray array]; 9 NSMutableArray *array = [NSMutableArray array]; 10 for (NSString *str in fileNameList) 11 { 12 if ([str containsString:@"ailian"]) 13 { 14 NSArray *smallArray = [str componentsSeparatedByString:@"/"]; 15 if ([smallArray count] >= 3) 16 { 17 NSString *temp = [smallArray objectAtIndex:1]; 18 if ([temp isEqualToString:@"Assets.xcassets"]) 19 { 20 NSString *subStr = [smallArray objectAtIndex:2]; 21 NSRange range = [subStr rangeOfString:@"."]; 22 if (range.location != NSNotFound) 23 { 24 NSString *fileName = [subStr substringToIndex:range.location]; 25 if ([fileNameArray count]) 26 { 27 if (![fileNameArray containsObject:fileName]) 28 { 29 [fileNameArray addObject:fileName]; 30 [filePathArray addObject:str]; 31 } 32 } 33 else 34 { 35 [fileNameArray addObject:fileName]; 36 [filePathArray addObject:str]; 37 } 38 } 39 } 40 } 41 } 42 } 43 //第一个数组保存的是图片名 44 //第二个数组保存的是图片的完整路径 45 [array addObject:fileNameArray]; 46 [array addObject:filePathArray]; 47 return array; 48 } 49 @end
1 #import "LMFFindAllUsePicture.h" 2 3 @implementation LMFFindAllUsePicture 4 5 #pragma mark --找出所有的.m文件 6 + (NSArray *)findAllFile:(NSArray *)fileNameList 7 { 8 NSMutableArray *array = [NSMutableArray array]; 9 for (NSString *str in fileNameList) 10 { 11 NSInteger length = str.length; 12 if ([str characterAtIndex:length-1] == 'm' && [str characterAtIndex:length-2] == '.') 13 { 14 [array addObject:str]; 15 } 16 } 17 return array; 18 } 19 20 #pragma mark --遍历所有的.m文件找到所有使用的图片 21 + (NSArray *)findAllPicture:(NSArray *)fileNameList WithDirectorPath:(NSString *)directorPath 22 { 23 NSFileManager *fileManager = [NSFileManager defaultManager]; 24 NSMutableArray *pictureArray = [NSMutableArray array]; 25 for (NSString *temp in fileNameList) 26 { 27 NSString *filePath = [directorPath stringByAppendingPathComponent:temp]; 28 29 if ([fileManager fileExistsAtPath:filePath]) 30 { 31 NSData *data = [fileManager contentsAtPath:filePath]; 32 NSString *contentStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 33 //对字符串进行解析 image:@" " imageNamed:@" " 34 NSMutableString *contentMutableStr = [NSMutableString stringWithString:contentStr]; 35 NSArray *subString = @[@"image:@"", @"imageNamed:@""]; 36 for (NSString *sub in subString) 37 { 38 for (NSString *pictureName in [self findPictureWithFileString:contentMutableStr andSubString:sub]) 39 { 40 if (![pictureArray containsObject:pictureName]) 41 { 42 [pictureArray addObject:pictureName]; 43 } 44 } 45 } 46 } 47 else 48 { 49 NSLog(@"文件不存在"); 50 } 51 } 52 return pictureArray; 53 } 54 55 + (NSArray *)findPictureWithFileString:(NSMutableString *)fileString andSubString:(NSString *)subString 56 { 57 NSMutableArray *array = [NSMutableArray array]; 58 BOOL flag = YES; 59 while (flag) 60 { 61 NSString *pictureName; 62 NSRange range = [fileString rangeOfString:subString]; 63 if (range.location != NSNotFound) 64 { 65 //将location之前的字符删除 66 [fileString deleteCharactersInRange:NSMakeRange(0, range.location+subString.length)]; 67 NSRange range1 = [fileString rangeOfString:@"""]; 68 if (range1.location != NSNotFound) 69 { 70 pictureName = [fileString substringToIndex:range1.location]; 71 [fileString deleteCharactersInRange:NSMakeRange(0, range1.location)]; 72 if (![array containsObject:pictureName]) 73 { 74 [array addObject:pictureName]; 75 } 76 } 77 } 78 else 79 { 80 flag = NO; 81 } 82 } 83 return array; 84 } 85 86 @end
1 #import "LMFDeleteAllNoUsePicture.h" 2 3 @implementation LMFDeleteAllNoUsePicture 4 + (NSArray *)findPictureNotUseWithAllPicture:(NSArray *)allPictureArray andUsePicture:(NSArray *)usePicture 5 { 6 NSMutableArray *array = [NSMutableArray array]; 7 for (NSString *pictureName in allPictureArray) 8 { 9 if (![usePicture containsObject:pictureName]) 10 { 11 if (![array containsObject:pictureName]) 12 { 13 [array addObject:pictureName]; 14 } 15 } 16 } 17 return array; 18 } 19 @end