Golang os.Stat Usage and Examples


Written By - Tuan Nguyen
Advertisement

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:

Advertisement
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

https://pkg.go.dev/os

 

Categories GO

Didn't find what you were looking for? Perform a quick search across GoLinuxCloud

If my articles on GoLinuxCloud has helped you, kindly consider buying me a coffee as a token of appreciation.

Buy GoLinuxCloud a Coffee

For any other feedbacks or questions you can either use the comments section or contact me form.

Thank You for your support!!

Leave a Comment