无法使用Golang扫描文件路径。

huangapple go评论74阅读模式
英文:

Impossible to scan a filepath with Golang

问题

我正在使用Go语言中的Cobra框架创建一个客户端,该客户端包括将文件上传到一个即将发布的传输服务中。我希望它能够最小程度地可定制,并具有默认的下载文件夹。

当我想要检查文件夹是否存在、文件夹是否是文件夹而不是文件,或者检查是否有权限向文件夹写入时,我遇到了一个巨大的goroutine错误。

了解情况:
我在 macOS 中使用拖放功能。

以下是代码部分的翻译:

var dldpath string
inquire.Query().Input(&dldpath, "Chemin du dossier de téléchargement ", nil).Exec()

println("le chemin est : ", dldpath)

if len(dldpath) == 0 {
	fmt.Println(chalk.Red, "Erreur : Vous devez spécifier un dossier à téléverser")
	os.Exit(0)
}
dir, err := os.Stat(dldpath)

if !dir.IsDir() {
	fmt.Println(chalk.Red, "Erreur : Le chemin spécifié n'est pas un dossier")
	os.Exit(0)
}

if errors.Is(err, os.ErrNotExist) {
	fmt.Println(chalk.Red, "Erreur : Dossier introuvable")
	os.Exit(0)
}


screen.Clear()
screen.MoveTopLeft()
fmt.Println(chalk.Green, "Dossier de téléchargement par défaut changé avec succès")

错误信息:(抱歉,我无法上传图片)

le chemin est :  '/Users/eliezayat/Downloads/bassine wavy.png'
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0x119b260]
goroutine 1 [running]:
freetranscli/cmd.glob..func3(0x1370900?, {0x11ef012?, 0x0?, 0x0?})
/Users/eliezayat/Documents/freetranscli/cmd/set.go:44 +0x280
github.com/spf13/cobra.(*Command).execute(0x1370900, {0x13a3d80, 0x0, 0x0})
/Users/eliezayat/go/pkg/mod/github.com/spf13/cobra@v1.6.1/command.go:920 +0x847
github.com/spf13/cobra.(*Command).ExecuteC(0x1370620)
/Users/eliezayat/go/pkg/mod/github.com/spf13/cobra@v1.6.1/command.go:1044 +0x3bd
github.com/spf13/cobra.(*Command).Execute(...)
/Users/eliezayat/go/pkg/mod/github.com/spf13/cobra@v1.6.1/command.go:968
freetranscli/cmd.Execute()
/Users/eliezayat/Documents/freetranscli/cmd/root.go:28 +0x25
main.main()
/Users/eliezayat/Documents/freetranscli/main.go:8 +0x17
exit status 2
英文:

I am creating a client with the Cobra framework in Go that consists of uploading a file to a transfer service that will be released very soon.
I want it to be a minimally customizable with a default download folder.

Problem when I want to check that a folder exists, that the folder is a folder and not a file or check that I have permission to write to the folder I get a huge goroutine error.

To know:
I use drag and drop in macOS

var dldpath string
inquire.Query().Input(&dldpath, "Chemin du dossier de téléchargement ", nil).Exec()

println("le chemin est : ", dldpath)

if len(dldpath) == 0 {
	fmt.Println(chalk.Red, "Erreur : Vous devez spécifier un dossier à téléverser")
	os.Exit(0)
}
dir, err := os.Stat(dldpath)

if !dir.IsDir() {
	fmt.Println(chalk.Red, "Erreur : Le chemin spécifié n'est pas un dossier")
	os.Exit(0)
}

if errors.Is(err, os.ErrNotExist) {
	fmt.Println(chalk.Red, "Erreur : Dossier introuvable")
	os.Exit(0)
}


screen.Clear()
screen.MoveTopLeft()
fmt.Println(chalk.Green, "Dossier de téléchargement par défaut changé avec succès")

Error : (sorry I can't upload images)

le chemin est :  '/Users/eliezayat/Downloads/bassine wavy.png'
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0x119b260]
goroutine 1 [running]:
freetranscli/cmd.glob..func3(0x1370900?, {0x11ef012?, 0x0?, 0x0?})
/Users/eliezayat/Documents/freetranscli/cmd/set.go:44 +0x280
github.com/spf13/cobra.(*Command).execute(0x1370900, {0x13a3d80, 0x0, 0x0})
/Users/eliezayat/go/pkg/mod/github.com/spf13/cobra@v1.6.1/command.go:920 +0x847
github.com/spf13/cobra.(*Command).ExecuteC(0x1370620)
/Users/eliezayat/go/pkg/mod/github.com/spf13/cobra@v1.6.1/command.go:1044 +0x3bd
github.com/spf13/cobra.(*Command).Execute(...)
/Users/eliezayat/go/pkg/mod/github.com/spf13/cobra@v1.6.1/command.go:968
freetranscli/cmd.Execute()
/Users/eliezayat/Documents/freetranscli/cmd/root.go:28 +0x25
main.main()
/Users/eliezayat/Documents/freetranscli/main.go:8 +0x17
exit status 2

答案1

得分: 1

如果dir变量为nil,你将收到nil指针解引用的错误。

在检查dirdir.IsDir())之前,最好先检查是否有任何错误(errors.Is):

dir, err := os.Stat(dldpath)
if errors.Is(err, os.ErrNotExist) {
    fmt.Println(chalk.Red, "Erreur : Dossier introuvable")
    os.Exit(0)
}
if !dir.IsDir() {
    fmt.Println(chalk.Red, "Erreur : Le chemin spécifié n'est pas un dossier")
    os.Exit(0)
}
英文:

In case if dir variable is nil you'll receive nil pointer dereference.

It's better to check for any error (errors.Is) before check for dir(dir.IsDir()):

dir, err := os.Stat(dldpath)
if errors.Is(err, os.ErrNotExist) {
fmt.Println(chalk.Red, "Erreur : Dossier introuvable")
os.Exit(0)
}
if !dir.IsDir() {
fmt.Println(chalk.Red, "Erreur : Le chemin spécifié n'est pas un dossier")
os.Exit(0)
}

huangapple
  • 本文由 发表于 2022年11月13日 20:53:05
  • 转载请务必保留本文链接:https://go.coder-hub.com/74421144.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定