---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、
<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! -----------------------
用OC实现的一个计算文件夹下代码行数的小程序
为了熟悉NSString类和NSArray,所以跟着老师写了个计算代码行数的小程序,以及一些体会。由于是初学者,所以对OC的很多东西都不是很熟悉,我知道这不能当作一个人失败的借口。万事开头难,这句话是很有道理的,但真真亲身体会过之后才发现,发现这句话讲的真好,真的很难阿。我学习OC也大概有两个月了吧,但是学起来还是很吃力,虽然原因来自各个方面,但是有些东西的真的要一些天赋,尽管现在的我没有丧失斗志,但有时候总有这样的问题出现在我的耳边:我到底适不适合做一个程序员。这几天的代码练习,让我明白实线很重要,同时也让我明白做好一个程序员要的不是记忆力,而是要掌握学习的方法,发现事物内在规律。前段时间,我老是记一些方法名之类的东西,那样很难受,因为搞不好就会忘记,以至于自己有时候很失落,特别是我这样的初学者,就更打击积极性了。今天上午写的这个程序,在写之前,我对这个程序其实还是蛮熟悉的,它的算法我基本是掌握了的,但是当我信心满满地准备敲的时候,我发现方法明总是记不住,是什么来者(其实老师的那个视频我都看了两、三遍了)。唉~又伤心有失落。没办法只能看视频了,这样边看边敲,总算是一遍下来了。但当我决心自己再敲一遍时,发现还是有些方法名记不住。
之后我发现,有些东西还是通过它的命名可以找到想要的方法。比如从一个文件里面读取文件内容这个方法,返回的的是内容所以先试下content开头的,发现没有,不要再试,返回的一个字符串,所以用string开头看看,一看果真有stringWithContentsOfFile:
stringWithContentsOfFile:<#(NSString *)#> encoding:<#(NSStringEncoding)#> error:<#(NSError *__autoreleasing *)#>];
通过传入路径,编码格式,最后传入nil(老师这样说的,不知为什么)。
获得内容后要通过\n把内容分割后放到数组中,这个又涉及到一个函数。componentsSeparatedByString(字符分割后的组件),分割后可不是它原先的组件(component),明白它的命名规则比记住方法名好像有效多了。有了上述两个方法之后就可以知道指定路径下文件中所含的代码行数。
但是我们要实现的路径不一定是文件的形式,有可能时文件夹,还有我们也不是所有的文件都要查看,一般查看的都是自己写的一些.m 、.h、 .c
文件。所以这里我们会用有关文件管理的一个类:NSFileManager这个类 ,这个类里面封装了一些对文件的操作,如:这个文件是否存在,这个文件路径是否有效,文件夹下的文件等等。这个类是采用单例设计模式的,同过defaultManager来创建对象。
对于一个给定的路径,我们首先要知道这文件是否存在,文件还是文件夹,NSFileManager类中有个方法可以帮我们:fileExsitsAtPath: isDirectory
fileExistsAtPath:<#(NSString *)#> isDirectory:<#(BOOL *)#>
通过确定文件还是文件夹,我们可以进一步操作,对于文件的我们通过判断是否.m、 .h、 .c类型的文件,让后进行计算代码行数。怎样判断一个路径的后缀名呢?NSString类中有一个获得路径名的方法pathExtension。知道后缀名之后就可以对它进行判定了。
对文件夹的操作:我们要获得文件下所有的文件名(包括扩展名),与原先的路径组成一个新的路径,继续深层次的搜索。其实这个有个递归的概念,是文件夹就下一层,这样一直下去,直到找到相应文件,计算出行数,放回上一层求和。首先获得文件夹下的文件名是NSFileManager类中的一个方法:contentsOfDirectoryAtPath: error: 返回值是一个NSArray数组。通过遍历这个数组得到这个文件夹的文件,然后进一步计算文件里面的代码。
具体实现请看以下代码:
// 计算文件的行数,得有文件路径path,返回值类型int
NSUInteger caculateLineNumberofFile(NSString *path)
{
// 代码行数
NSUInteger count = 0;
//得到文件管理这个类
NSFileManager *mgr = [NSFileManagerdefaultManager];
//对给的路径进行分析,是文件夹还是文件
BOOL isDir = NO;
//给的路径是否存在
BOOL exist = [mgr fileExistsAtPath:path isDirectory:&isDir];
//路径不存在,程序结束
if(!exist) return0;
//判断给出的路径是否是文件夹还是文件
if(isDir)
{
//如果是文件夹的话,把该文件夹中所有的文件的文件名放入array中
NSArray *array = [mgr contentsOfDirectoryAtPath:path error:nil];
//从array拿出每个文件的文件名,与先前的文件路径组合成新的文件路径。
for(NSString *fileNamein array)
{
NSString *newPath = [NSStringstringWithFormat:@"%@/%@",path,fileName];
//计算出新路径中文件的代码行数,并与前面的相加
count +=caculateLineNumberofFile(newPath);
}
return count;
}else
{
// 拿到文件的扩展名
NSString *extension = [path pathExtension];
//只对.m 、.h、.c文件进行代码量计算,不是上面文件的跳过
if(![extension isEqualToString:@"m" ]&&![extension isEqualToString:@"h"]&&![extensionisEqualToString:@"c"])
return 0;
// 获得文件中的内容
NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncodingerror:nil ];
//利用\n来分割代码,得到每一行的代码将其作为数组的一个元素
NSArray *code = [content componentsSeparatedByString:@"\n"];
//打印出每个文件包含的代码数
NSRange range = [path rangeOfString:@"/Users/beibei/Desktop/"];
NSString *shortPath = [path stringByReplacingCharactersInRange:range withString:@""];
NSLog(@"%@---%ld",shortPath,code.count);
//最终数组的个数就是要求代码行数,返回
return code.count;
}
}
---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、
<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! -----------------------