How to check if a file exists or not in Go/Golang
To check if a file exists or not in Go
language, we can make use of os.Stat(filePath)
and errors.Is(error, os.ErrNotExist)
functions in Go
.
Let’s go through an example to understand it further.
Using os.Stat(filePath)
and errors.Is(err, os.ErrNotExist)
I have created a file called file-exists-or-not.txt
in the same folder as file-exists.go
program.
package main
import (
"errors"
"fmt"
"os"
)
func checkFileExists(filePath string) bool {
_, error := os.Stat(filePath)
//return !os.IsNotExist(err)
return !errors.Is(error, os.ErrNotExist)
}
func main() {
var filePath string = "file-exists-or-not.txt"
isFileExist := checkFileExists(filePath)
if isFileExist {
fmt.Println("file exist")
} else {
fmt.Println("file not exists")
}
}
I have created a separate utility function checkFileExists()
in the above Go
program, to check if a file exists or not in the given the file path.
We can combine both os.Stat(filePath)
and errors.Is(error, os.ErrNotExist)
functions into single statement as shown below.
package main
import (
"errors"
"fmt"
"os"
)
func main() {
var filePath string = "file-exists-or-not.txt"
if _, err := os.Stat(filePath); errors.Is(err, os.ErrNotExist) {
fmt.Println("file not exist")
} else {
fmt.Println("file exists")
}
}
CreateFile The system cannot find the file specified
If the file does not exists in the given path, errors.Is()
function returns following error message CreateFile The system cannot find the file specified.
.
var filePath string = "file-not-exists.txt"
if _, err := os.Stat(filePath); errors.Is(err, os.ErrNotExist) {
fmt.Println(err.Error())
}
Here is the output
>go run check-file-exists-or-not.go
CreateFile file-not-exists.txt: The system cannot find the file specified.
Using os.Stat(filePath)
and os.IsNotExist()
In place of errors.Is(err, os.ErrNotExist)
function, we can use os.IsNotExist()
function as well.
package main
import (
"errors"
"fmt"
"os"
)
func main() {
var filePath string = "file-exists-or-not.txt"
_, error := os.Stat(filePath)
if error == nil {
fmt.Println("file %s exists", filePath)
} else if os.IsNotExist(error) {
fmt.Println("file %s does not exists", filePath)
} else {
fmt.Println("file %s stat error: %v", filePath, error)
}
}
But according to the Go language documentation we should use errors.Is(err, os.ErrNotExist)
instead of os.IsNotExist()
.
// This function predates errors.Is. It only supports errors returned by
// the os package. New code should use errors.Is(err, fs.ErrNotExist).
func IsNotExist(err error) bool {
return underlyingErrorIs(err, ErrNotExist)
}
https://github.com/golang/go/blob/master/src/os/error.go#L90-L91
Using os.Open()
We can use Go’s os.Open()
function to check if a file exist or not.
package main
import (
"fmt"
"os"
)
func checkFileExists(filePath string) bool {
_, error := os.Open(filePath) // For read access.
return error == nil
}
func main() {
var filePath string = "file-exists-or-not.txt"
isFileExist := checkFileExists(filePath)
if isFileExist {
fmt.Println("file exist")
} else {
fmt.Println("file not exists")
}
}