统计源代码行数的工具(go语言版)
源代码:
1 package main
2
3 import (
4 "bufio"
5 "fmt"
6 "os"
7 "path/filepath"
8 "strings"
9 )
10
11 // isJavaFile 检查文件是否为 Java 文件
12 func iSuffixFile(filename string,suffix string) bool {
13 return strings.HasSuffix(filename, suffix)
14 }
15
16 // countLines 统计文件中非空白的行数
17 func countLines(filePath string) (int, error) {
18 file, err := os.Open(filePath)
19 if err != nil {
20 return 0, err
21 }
22 defer file.Close()
23
24 scanner := bufio.NewScanner(file)
25 lineCount := 0
26
27 for scanner.Scan() {
28 line := strings.TrimSpace(scanner.Text())
29 if line != "" {
30 lineCount++
31 }
32 }
33
34 return lineCount, scanner.Err()
35 }
36
37 func main() {
38 if len(os.Args) != 3 {
39 fmt.Println("用法: scLineCounter <目录路径> <文件后缀>")
40 os.Exit(1)
41 }
42
43 totalLines := 0
44 root := os.Args[1]
45 suffix := os.Args[2]
46
47 walkFunc := func(path string, info os.FileInfo, err error) error {
48 if err != nil {
49 return err
50 }
51
52 if !info.IsDir() && iSuffixFile(info.Name(),suffix) {
53 lines, err := countLines(path)
54 if err != nil {
55 fmt.Fprintf(os.Stderr, "无法读取文件 %s: %v\n", path, err)
56 return nil
57 }
58 totalLines += lines
59 }
60
61 return nil
62 }
63
64 err := filepath.Walk(root, walkFunc)
65 if err != nil {
66 fmt.Fprintf(os.Stderr, "遍历目录时出错: %v\n", err)
67 os.Exit(1)
68 }
69
70 fmt.Printf("总计非空白代码行数: %d\n", totalLines)
71 }
编译
go build scLineCounter.go
用法:
scLineCounter <目录路径> <文件后缀>
scLineCounter D:\projects\java\api\trunk java