计算当前路径下所有代码文件的总行数 .c\.h\.m文件的总行数
/*
计算当前路径下所有代码文件的行数 .c\.h\.m文件的总行数
涉及到NSArray、NSString、NSFileManager
*/
// 计算当前全路径(文件\文件夹)下所有文件的行数
// 接收参数path:文件的全路径(文件、文件夹)
NSUInteger codeLinesCount(NSString *path)
{
// 1.获得文件管理者 单例模式:整个程序的运行过程中,NSFileManager类的对象只有这一个
NSFileManager *fmg = [NSFileManager defaultManager];
// 2.判断path是文件夹还是文件路径
BOOL isDir = NO; // 标记是否为文件夹
// 路径是否存在(有效)
BOOL isExist = [fmg fileExistsAtPath:path isDirectory:&isDir];
// 3.如果路径不存在,直接返回0退出函数
if (!isExist)
{
NSLog(@"文件路径无效");
return 0;
}
// 路径存在
if (isDir)
{
// 是文件夹
// NSLog(@"是个文件夹");
// 返回 当前路径(该文件夹)目录下所有(路径)---文件、文件夹路径 列表(数组)
// 数组元素 并不是全路径
NSArray *filePathsList = [fmg contentsOfDirectoryAtPath:path error:nil];
// NSLog(@"%@", filePathsList);
NSUInteger count = 0; // 行数
// 遍历数组中的所有路径(文件名\文件夹名)
for (NSString *filePath in filePathsList)
{
// 拼接全路径 当前路径文件夹(子文件\子文件夹)的全路径
NSString *fullPath = [NSString stringWithFormat:@"%@/%@", path, filePath];
// NSLog(@"%@", fullPath);
/*
此处 递归
调用本身 返回 每个最终子文件的行数
codeLinesCount(fullPath);
*/
// 把每个最终子路径文件的行数 累加每个子路径的总行数
count += codeLinesCount(fullPath); // 精髓
}
return count;
}
else
{ // 是个文件
// NSLog(@"是个文件");
/*
过滤出.c\.h\.m文件
是个文件 判断文件拓展名
返回拓展名(忽略大小写---先全部转为小写)
*/
NSString *extension = [[path pathExtension] lowercaseString];
// NSLog(@"拓展名为 %@", extension);
if ( !([extension isEqualToString:@"c"]
||[extension isEqualToString:@"h"]
||[extension isEqualToString:@"m"]) )
{
return 0;
}
// 1.加载文件内容,到一个字符串对象
NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
// 2.将文件内容(字符串内容)以'\n'每一行进行 切分, 切分好后的内容放入数组 返回
NSArray *array = [content componentsSeparatedByString:@"\n"];
// 每一个数组元素都是一个NSString对象,就是文件中一行的内容
// int i = 0;
// for (NSString *str in array)
// {
// i++;
// NSLog(@"%d---%@",i, str);
// }
// NSLog(@"文件名:%@ --- 行数:%ld", path, array.count);
NSString *shortPath = [path stringByReplacingCharactersInRange:[path rangeOfString:@"/Users/Mac/Desktop/"] withString:@" "];
NSLog(@"文件名:%@ --- 行数:%ld", shortPath, array.count);
return array.count; // 数组元素个数就是行数
}
}