- (void)viewDidLoad {
[super viewDidLoad];
// 注意:代碼得在Mac下跑,不能再iPhone上,路徑不對(duì)
// 在這里寫(xiě)下需要統(tǒng)計(jì)的代碼的目錄
NSString *path = @"/Users/crystal/projects/CodeLineDemo";
NSLog(@"在這個(gè)文件中代碼行數(shù)是:%ld",codeLineCount(path,path));
}
//統(tǒng)計(jì)代碼行數(shù)函數(shù)(運(yùn)用遞歸)
// 這就是實(shí)現(xiàn)功能的方法,行參是一個(gè)路徑
NSUInteger codeLineCount(NSString *path,NSString *rootPath)
{
NSUInteger num = 0;
// 判斷是否是文件夾,如果說(shuō)file是文件夾的時(shí)候就是YES不是文件夾的話就是NO
BOOL flag = NO;
// 首先判斷這個(gè)文件存不存在,存在的話是文件還是文件夾
// 關(guān)于文件目錄的操作,取得文件管理器的單例對(duì)象
NSFileManager *file = [NSFileManager defaultManager];
BOOL isExit = [file fileExistsAtPath:path isDirectory:&flag];
if(!isExit){
NSLog(@"路經(jīng)有誤?。?!");
return 0;
}else{
// 如果說(shuō)他是文件夾的話,就得到他的里面去把文件找出來(lái)
if(flag){
// 獲取這個(gè)文件夾中的所有的文件名字
NSArray *a = [file contentsOfDirectoryAtPath:path error:nil];
for(id fileName in a){
//? 獲得所有文件的完全路徑
NSString *s1 = [NSString stringWithFormat:@"%@/%@",path,fileName];
num? = num + codeLineCount(s1,rootPath);
}
}else{
// 如果說(shuō)是文件并且擴(kuò)展名是.h 或者是.m的話就直接進(jìn)行統(tǒng)計(jì)
NSString *h = @"h";
NSString *m = @"m";
NSString *c = @"c";
NSString *mm = @"mm";
NSString *swift = @"swift";
//查看擴(kuò)展名是否是上面這三個(gè)但是,擴(kuò)展名又可能是大寫(xiě),所以這個(gè)時(shí)候就要先把擴(kuò)展名轉(zhuǎn)為小寫(xiě)再比較
NSString *pathE = [[path pathExtension] lowercaseString];
NSRange rect = [path rangeOfString:rootPath];
NSString *newPath = [path stringByReplacingCharactersInRange:rect withString:@""];
if([pathE isEqualToString:h] || [pathE isEqualToString:m] || [pathE isEqualToString:c] || [pathE isEqualToString:mm]|| [pathE isEqualToString:swift]){
num = test(path);
NSLog(@"%@? ---? %ld行",newPath,num);
}else{
return 0;
}
}
}
return num;
}
NSUInteger test(NSString *path)
{
// 可以首先獲取文件中的內(nèi)容,然后利用字符串分割計(jì)數(shù)將空格字符串以回車(chē)分割,這個(gè)時(shí)候會(huì)生成一個(gè)數(shù)組,這個(gè)時(shí)候我就可以通過(guò)計(jì)算數(shù)組中的元素來(lái)計(jì)算文檔中的行數(shù)了
NSString *s1 = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
// 利用字符串分割函數(shù),將字符串分割生成一個(gè)數(shù)組
NSArray *a = [s1 componentsSeparatedByString:@"\n"];
return a.count;
}