From 0c5ff894f8c731a84b46d2c2b3bee91588d84efd Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Thu, 13 Jul 2023 14:18:42 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E9=80=9A=E8=BF=87=20?= =?UTF-8?q?file.FilePaths=20=E8=8E=B7=E5=8F=96=E7=9B=AE=E5=BD=95=E4=B8=8B?= =?UTF-8?q?=E6=89=80=E6=9C=89=E6=96=87=E4=BB=B6=EF=BC=8C=E9=80=9A=E8=BF=87?= =?UTF-8?q?=20file.LineCount=20=E7=BB=9F=E8=AE=A1=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E8=A1=8C=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/file/file.go | 47 +++++++++++++++++++++++++++++++++++++++++ utils/file/file_test.go | 22 +++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 utils/file/file_test.go diff --git a/utils/file/file.go b/utils/file/file.go index 91c229d..c17936c 100644 --- a/utils/file/file.go +++ b/utils/file/file.go @@ -4,6 +4,7 @@ import ( "bufio" "io" "os" + "path/filepath" ) // PathExist 路径是否存在 @@ -79,3 +80,49 @@ func ReadBlockHook(filePath string, bufferSize int, hook func(data []byte)) erro } } } + +// LineCount 统计文件行数 +func LineCount(filePath string) int { + file, err := os.Open(filePath) + if err != nil { + return 0 + } + + line := 0 + reader := bufio.NewReader(file) + for { + _, isPrefix, err := reader.ReadLine() + if err != nil { + break + } + if !isPrefix { + line++ + } + } + return line +} + +// FilePaths 获取指定目录下的所有文件路径 +// - 包括了子目录下的文件 +// - 不包含目录 +func FilePaths(dir string) []string { + var paths []string + abs, err := filepath.Abs(dir) + if err != nil { + return paths + } + files, err := os.ReadDir(abs) + if err != nil { + return paths + } + + for _, file := range files { + fileAbs := filepath.Join(abs, file.Name()) + if file.IsDir() { + paths = append(paths, FilePaths(fileAbs)...) + continue + } + paths = append(paths, fileAbs) + } + return paths +} diff --git a/utils/file/file_test.go b/utils/file/file_test.go new file mode 100644 index 0000000..7f24ff4 --- /dev/null +++ b/utils/file/file_test.go @@ -0,0 +1,22 @@ +package file_test + +import ( + "fmt" + "github.com/kercylan98/minotaur/utils/file" + "strings" + "testing" +) + +func TestFilePaths(t *testing.T) { + var line int + var fileCount int + for _, path := range file.FilePaths(`D:\sources\minotaur`) { + if !strings.HasSuffix(path, ".go") { + continue + } + fmt.Println(path) + line += file.LineCount(path) + fileCount++ + } + fmt.Println("total line:", line, "total file:", fileCount) +}