我有如下目录:

myproject/
├─ data/
│  ├─ test.csv
├─ go.mod
├─ main.go
package main

import (
    "fmt"
    "log"
    "os"
    "path/filepath"
)

func main() {

    fullPath := `C:\myproject\data\test.csv`
    f, err := os.Open(fullPath)
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()

    fileInfo, err := f.Stat()
    if err != nil {
        log.Fatal(err)
    }

    // get full file path
    filePath, err := filepath.Abs(fileInfo.Name())
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(filePath)
}

然而,filepath.Abs(fileInfo.Name())等于C:\myproject\test.csv.而不是我想要的C:\myproject\data\test.csv

IIUC,fileInfo.Name()应该会给我提供与输入到os.Open()中的路径相同的路径,那么为什么filepath.Abs()不能识别文件所在的目录?filepath.Dir(fileInfo.Name())也会给我.……我预计是C:\myproject\data\岁.

我正在从myproject目录内运行我的GO文件.

go version 1.19.3 windows/amd64

推荐答案

fileInfo.Name()只返回文件的基本名称as documented,没有路径信息.因此,您只是将一个原始文件名传递给filepath.Abs.因此,该函数执行exactly what the documentation says it will do:

如果该路径不是绝对路径,则它将与当前工作目录联接,以将其转换为绝对路径.

Go相关问答推荐

如何存储来自异步Goroutine的返回值列表?

你能把用户界面文件中的GTK4应用程序窗口添加到GTK4应用程序中吗?

Redis:尽管数据存在,但 rdb.Pipelined 中出现redis:nil错误

如何将 DirName 和 serial 添加到 X509v3 Authority Key Identifier

gopacket:IP-in-IP 数据包上的解码层

由于 main.go 文件中的本地包导入导致构建 docker 容器时出错

具有两个参数的动态规划:天数和优惠券

如果值为 false,gRPC 不返回布尔值

有没有办法约束(通用)类型参数?

转换朴素递归硬币问题时的记忆错误

go-echo中如何防止+转义

获取切片元素的地址是否意味着 Go 中元素的副本?

Golang 使用 docker 将敏感数据作为参数传递

Golang:每个键具有多个值的映射

有没有办法在一个 goroutine 返回后延迟后取消上下文?

如何在 Unmarshal 中使用泛型(转到 1.18)

如何从字符串中删除多个换行符`\n`但只保留一个?

try 执行`go test ./... -v`时,Golang中有没有办法设置标志

(如何)我可以基于接口抽象地实现Stringer吗?

Go http标准库中的内存泄漏?