设计一个函数计算代码量
该示例需要完成的任务,把某个代码目录中所有的代码文件进行扫描,并计算所有代码文件中代码量(总代码行数);基本思想:
1、设计的该函数应该具备:传进文件目录,返回代码行数;
2、文件目录以字符串的方式传进函数体,如果无效给予提示;
3、如果传进的参数为目录,则将该目录及子目录下的所有文件全部计算出来并求和;
4、由于是计算代码量,所以只对.h/.m/.c的文件敏感(即忽略其他类型文件);
5、需要用到NSString及相关方法、NSArray及相关方法、NSFileManager及相关方法;
6、最重要的是:递归思想;
7、相关说明都在代码注释中;
代码示例
main.m
//
//main.m
//Practice
//
//Created by yusian on 14-3-23.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//
#import <Foundation/Foundation.h>
NSUInteger fileLineCounts(NSString *string);
int main()
{
// 创建一个字符串用来存储文件路径
NSString * path = @"/Users/yusian/Documents/Objective-C";
// 创建一个临时变量接收结果返回值
NSUInteger count = fileLineCounts(path);
// 打印最终结果
NSLog(@"%@ 下包含的代码总行数为:%ld", path, count);
return 0;
}
// 主功能函数实现体,形参为需要计算的文件所在路径
NSUInteger fileLineCounts(NSString *path)
{
// NSFileManager类,创建单例对象,引进这个类主要是需要用到该类文件管理的几个功能
NSFileManager *mgr = ;
BOOL dir = NO;
// 方法:"fileExistsAtPath: isDirectory:"的主要功能为返回当前路径是否存在,并且返回是否为一个文件夹
// 如果存在则返回YES,不存在返回NO,同时通过一个BOOL型指针变量修改另外一个值,实为返回两个参数
BOOL exits = ;
/****************************
判断之后有三种结果:
1、该路径不存在;
2、该路径为一个目录;
3、该路径为一个文件
****************************/
// 第一种结果,路径不存在,直接退出该函数
if (!exits) {
NSLog(@"文件路径不存在!!!");
return 0;
}
// 另外两种结果为存在,再分两种情况:1、文件夹;2、文件;这两种情况处理方式不一样
// 首先定义一个计算器,用来接收返回的值
NSUInteger count = 0;
// 1、文件夹处理方式
// 根据上述的判断结果,定义文件夹处理开始
if (dir) {
// 定义一个数组用来接收当前文件夹中所有对象(文件夹和文件)
// 再次利用NSFileManager对象的一个方法:"contentsOfDirectoryAtPath: error:"
// 该方法的返回值为一个数组,数组中各元素为当前目录下的的所有文件与子目录
NSArray * current = ;
// 对该数组进行遍历
for (NSString *str in current) {
// 遍历出来的每个元素为目录或文件,再对该目录或文件进行处理,实质上又回到了该函数的初衷
// 递归给函数本身,由于函数的实参为绝对路径,而数组中取出来的元素为相对路径
// 使用stringWithFormat方法对该元素进行重新组合,传给函数本身
NSString *fullPath = ;
// 函数的结果返回值为当前路径下各文件返回值,对其进行累加并重新赋值
// 可得到当前目录所有文件返回值之和;
count += fileLineCounts(fullPath);
}
// 打印当前目录及返回值之和
// NSLog(@"%@,%ld", path, count);
// 返回最终函数结果值,并退出函数
return count;
} else {
// 如果判断当前路径为文件,进入该代码区进行以下处理
// 首先利用NSString的对象方法“pathExtension”对文件名取扩展名,返回值为NSString
// 再通过NSString的lowercaseString方法进行大小写转换(全转换成小写)
NSString *extension = [ lowercaseString];
// 对各扩展名进行过滤,非.h .m .c的文件,直接退出函数
if (!(
||
|| )) {
return 0;
}
// 如果OC相关的文件(.h/.m/.c)则通过"stringWithContentsOfFile: encoding: error:"方法读取到字符串中
NSString *str = ;
// 通过字符串的“componentsSeparatedByString:”方法对字符串进行分割
// 该方法的返回值为一个数组,如果分割的依据为回车符,则数组长度数即为该文件的行数
NSArray * array = ;
// 返回该数值给外部调用者,由于array.count返回值为NSUInteger类型,所以所有的相关变量定义与返回值类型均为NSUInteger类型
return array.count;
}
}运行结果:
2014-03-23 21:22:45.904 Practice /Users/yusian/Documents/Objective-C 下包含的代码总行数为:5935Program ended with exit code: 0
页:
[1]