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