英文:
golang read log file contents inside a directory
问题
我正在尝试读取目录中的所有日志文件,下面的代码可以读取文件名,但无法读取其内容。
控制台输出:
ds-api-doc-.log false
2023/03/21 11:27:11 open /Users/xxx/ds-api-doc.log: no such file or directory
代码如下:
files, err := ioutil.ReadDir("./logs/")
if err != nil {
log.Fatal(err)
}
fmt.Println(totalTicks)
for _, file := range files {
fmt.Println(file.Name(), file.IsDir())
abs, err := filepath.Abs(file.Name())
file, err := os.Open(abs)
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
}
请注意,这只是读取文件内容的部分代码,可能还有其他问题需要解决。
英文:
i'm trying to read all log files inside a directory, Below code is able to read the filename but not its contents.
console output
ds-api-doc-.log false
2023/03/21 11:27:11 open /Users/xxx/ds-api-doc.log: no such file or directory
files, err := ioutil.ReadDir("./logs/")
if err != nil {
log.Fatal(err)
}
fmt.Println(totalTicks)
for _, file := range files {
fmt.Println(file.Name(), file.IsDir())
abs, err := filepath.Abs(file.Name())
file, err := os.Open(abs)
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
}
答案1
得分: 1
file.Name()
仅返回文件的基本名称。
filepath.Abs()
将给定的路径(在这种情况下是文件的基本名称)与当前工作目录连接起来。因此,返回的 abs
值将缺少文件路径中的 ./logs/
部分。
要修复这个问题,你可以执行以下操作:
abs, err := filepath.Abs(filepath.Join("logs", file.Name()))
或者你可以使用 filepath.WalkDir
,它将文件的路径提供给 fn
参数。
err := filepath.WalkDir("./logs/", func(path string, de fs.DirEntry, err error) error) {
if err != nil {
return err
} else if de.IsDir() {
return nil
}
file, err := os.Open(path)
// ...
return nil
})
英文:
file.Name()
returns only the base name of the file.
filepath.Abs()
will join the given path, in this case the file's base name, to the current working directory. Therefore the returned abs
value will be missing the ./logs/
segment of the file's path.
To fix that you can do the following:
abs, err := filepath.Abs(filepath.Join("logs", file.Name()))
Alternatively you can use filepath.WalkDir
, which provides the file's path to the fn
argument.
err := filepath.WalkDir("./logs/", func(path string, de fs.DirEntry, err error) error) {
if err != nil {
return err
} else if de.IsDir() {
return nil
}
file, err := os.Open(path)
// ...
return nil
})
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论