Introduction to golang os package
Working with files sometimes requires file metadata information. In today's article, we will strive for a way to get file info in Golang with detailed examples. Golang built-in package os provides types and functions to help us to work with files and directories:
os package
: Package os provides a platform-independent interface to operating system functionality. The design is Unix-like, although the error handling is Go-like; failing calls return values of type error rather than error numbers. Often, more information is available within the error. For example, if a call that takes a file name fails, such as Open or Stat, the error will include the failing file name when printed and will be of type *PathError
, which may be unpacked for more information.
Example-1: Get file information with os.Stat function
Without opening the file
func Stat(name string) (FileInfo, error):
Stat returns a FileInfo describing the named file. If there is an error, it will be of type *PathError
.
type FileInfo
:
// A FileInfo describes a file and is returned by Stat.
type FileInfo interface {
Name() string // base name of the file
Size() int64 // length in bytes for regular files; system-dependent for others
Mode() FileMode // file mode bits
ModTime() time.Time // modification time
IsDir() bool // abbreviation for Mode().IsDir()
Sys() any // underlying data source (can return nil)
}
Here is an example of getting the file info without opening it. After we have type FileInfo,
we can print this struct out to the console:
package main
import (
"fmt"
"os"
)
func main() {
//file name
path := "./data.txt"
//get file info
fileInfo, err := os.Stat(path)
//handle error
if err != nil {
panic(err)
}
// print file info
fmt.Printf("File info: %+v\n", fileInfo)
}
Output:
File info: &{name:data.txt size:52 mode:436 modTime:{wall:145648606 ext:63802720083 loc:0x53e9a0} sys:{Dev:66307 Ino:42344757 Nlink:1 Mode:33204 Uid:1000 Gid:1000 X__pad0:0 Rdev:0 Size:52 Blksize:4096 Blocks:8 Atim:{Sec:1667123283 Nsec:149648694} Mtim:{Sec:1667123283 Nsec:145648606} Ctim:{Sec:1667123283 Nsec:145648606} X__unused:[0 0 0]}}
Open the file to get file information
In the example below, we will open the file and then get the file information by Stat()
function:
package main
import (
"fmt"
"os"
)
func main() {
// file name
path := "./data.txt"
// open file
file, err := os.Open(path)
if err != nil {
panic(err)
}
// get file info
fileInfo, err := file.Stat()
if err != nil {
panic(err)
}
// print file info
fmt.Printf("File info: %+v\n", fileInfo)
}
Output:
File info: &{name:test.txt size:52 mode:420 modTime:{wall:271008975 ext:63801858651 loc:0x53c820} sys:{Dev:64769 Ino:396430 Nlink:1 Mode:33188 Uid:0 Gid:0 X__pad0:0 Rdev:0 Size:52 Blksize:4096 Blocks:8 Atim:{Sec:1666261851 Nsec:271008975} Mtim:{Sec:1666261851 Nsec:271008975} Ctim:{Sec:1666261851 Nsec:271008975} X__unused:[0 0 0]}}
Example-2: Check if file exists with os.Stat function
In this example, we will see how to check file existence in Golang with os.Stat
and IsNotExist()
function:
func IsNotExist(err error) bool
: IsNotExist returns a boolean indicating whether the error is known to report that a file or directory does not exist. It is satisfied by ErrNotExist as well as some syscall errors.
Directory structure:
├── data_test
│  └── data_test.txt
├── data.txt
└── osStat.go
package main
import (
"fmt"
"os"
)
func main() {
// file name
path1 := "./data.txt"
path2 := "./data2.txt"
path3 := "./data_test"
fmt.Println("File", path1, "exist?:", checkFileExists(path1))
fmt.Println("File", path2, "exist?:", checkFileExists(path2))
fmt.Println("File", path3, "exist?:", checkFileExists(path3))
}
// check file exists
func checkFileExists(fname string) bool {
info, err := os.Stat(fname)
if os.IsNotExist(err) {
return false
}
return !info.IsDir()
}
Output:
File ./data.txt exist?: true
File ./data2.txt exist?: false
File ./data_test exist?: false
Summary
The code shown above illustrates how to use os.Stat()
function to get file info or check if a file exists in Golang. Please share any more approaches you are aware of that are not listed above in the comments.
References