Working with Files and Directories
Working with files and directories is a fundamental aspect of software development and system administration. Files represent persistent data stored on storage devices, while directories (or folders) provide a way to organize and structure files hierarchically within a file system.
In software development, interacting with files and directories allows applications to read input data, write output data, store configurations, and manage resources such as logs and temporary files. Common operations include reading from and writing to files, creating, deleting, moving, and renaming files and directories, and querying file metadata such as size, permissions, and timestamps.
File system operations are essential in system administration for managing server configurations, deploying applications, performing backups, and monitoring system health. Administrators use tools and commands to navigate file systems, set permissions, manage file attributes, and troubleshoot disk space issues.
-
Create an empty file
package mainimport ("log""os")func main() {emptyFile, err := os.Create("empty.txt")if err != nil {log.Fatal(err)}log.Println(emptyFile)emptyFile.Close()}package main import ( "log" "os" ) func main() { emptyFile, err := os.Create("empty.txt") if err != nil { log.Fatal(err) } log.Println(emptyFile) emptyFile.Close() }package main import ( "log" "os" ) func main() { emptyFile, err := os.Create("empty.txt") if err != nil { log.Fatal(err) } log.Println(emptyFile) emptyFile.Close() }
Output :
PS C:\GO_Language\file> go run empty.go2022/08/20 15:45:16 &{0xc00007e780}PS C:\GO_Language\file> go run empty.go 2022/08/20 15:45:16 &{0xc00007e780}PS C:\GO_Language\file> go run empty.go 2022/08/20 15:45:16 &{0xc00007e780}
-
Create directory
package mainimport ("log""os")func main() {_, err := os.Stat("text")if os.IsNotExist(err) {errDir := os.MkdirAll("text", 0755)if errDir != nil {log.Fatal(err)}}}package main import ( "log" "os" ) func main() { _, err := os.Stat("text") if os.IsNotExist(err) { errDir := os.MkdirAll("text", 0755) if errDir != nil { log.Fatal(err) } } }package main import ( "log" "os" ) func main() { _, err := os.Stat("text") if os.IsNotExist(err) { errDir := os.MkdirAll("text", 0755) if errDir != nil { log.Fatal(err) } } }
Output :
PS C:\GO_Language\file> go run create.goPS C:\GO_Language\file> go run create.goPS C:\GO_Language\file> go run create.go
-
Rename a file
package mainimport ("log""os")func main() {oldName := "test.txt"newName := "testing.txt"err := os.Rename(oldName, newName)if err != nil {log.Fatal(err)}}package main import ( "log" "os" ) func main() { oldName := "test.txt" newName := "testing.txt" err := os.Rename(oldName, newName) if err != nil { log.Fatal(err) } }package main import ( "log" "os" ) func main() { oldName := "test.txt" newName := "testing.txt" err := os.Rename(oldName, newName) if err != nil { log.Fatal(err) } }
Output :
PS C:\GO_Language\file> go run rename.goPS C:\GO_Language\file> go run rename.goPS C:\GO_Language\file> go run rename.go
-
Copy file at the specified location
package mainimport ("io""log""os")func main() {sourceFile, err := os.Open("C:/GO_Language/file/test.txt")if err != nil {log.Fatal(err)}defer sourceFile.Close()// Create new filenewFile, err := os.Create("C:/GO_Language/test.txt ")if err != nil {log.Fatal(err)}defer newFile.Close()bytesCopied, err := io.Copy(newFile, sourceFile)if err != nil {log.Fatal(err)}log.Printf("Copied %d bytes.", bytesCopied)}package main import ( "io" "log" "os" ) func main() { sourceFile, err := os.Open("C:/GO_Language/file/test.txt") if err != nil { log.Fatal(err) } defer sourceFile.Close() // Create new file newFile, err := os.Create("C:/GO_Language/test.txt ") if err != nil { log.Fatal(err) } defer newFile.Close() bytesCopied, err := io.Copy(newFile, sourceFile) if err != nil { log.Fatal(err) } log.Printf("Copied %d bytes.", bytesCopied) }package main import ( "io" "log" "os" ) func main() { sourceFile, err := os.Open("C:/GO_Language/file/test.txt") if err != nil { log.Fatal(err) } defer sourceFile.Close() // Create new file newFile, err := os.Create("C:/GO_Language/test.txt ") if err != nil { log.Fatal(err) } defer newFile.Close() bytesCopied, err := io.Copy(newFile, sourceFile) if err != nil { log.Fatal(err) } log.Printf("Copied %d bytes.", bytesCopied) }
Output :
PS C:\GO_Language\file> go run f1.go2022/08/20 15:39:48 Copied 59 bytes.PS C:\GO_Language\file> go run f1.go 2022/08/20 15:39:48 Copied 59 bytes.PS C:\GO_Language\file> go run f1.go 2022/08/20 15:39:48 Copied 59 bytes.
-
Move a File
package mainimport ("log""os")func main() {oldLocation := "C:/GO_Language/test.txt"newLocation := "C:/GO_Language/file/test.txt"err := os.Rename(oldLocation, newLocation)if err != nil {log.Fatal(err)}}package main import ( "log" "os" ) func main() { oldLocation := "C:/GO_Language/test.txt" newLocation := "C:/GO_Language/file/test.txt" err := os.Rename(oldLocation, newLocation) if err != nil { log.Fatal(err) } }package main import ( "log" "os" ) func main() { oldLocation := "C:/GO_Language/test.txt" newLocation := "C:/GO_Language/file/test.txt" err := os.Rename(oldLocation, newLocation) if err != nil { log.Fatal(err) } }
Output :
PS C:\GO_Language\file> go run move.goPS C:\GO_Language\file> go run move.goPS C:\GO_Language\file> go run move.go
-
Getting Metadata of a file
package mainimport ("fmt""log""os")func main() {fileStat, err := os.Stat("test.txt")if err != nil {log.Fatal(err)}fmt.Println("File Name:", fileStat.Name())fmt.Println("Size:", fileStat.Size())fmt.Println("Permissions:", fileStat.Mode())fmt.Println("Last Modified:", fileStat.ModTime())fmt.Println("Is Directory: ", fileStat.IsDir())}package main import ( "fmt" "log" "os" ) func main() { fileStat, err := os.Stat("test.txt") if err != nil { log.Fatal(err) } fmt.Println("File Name:", fileStat.Name()) fmt.Println("Size:", fileStat.Size()) fmt.Println("Permissions:", fileStat.Mode()) fmt.Println("Last Modified:", fileStat.ModTime()) fmt.Println("Is Directory: ", fileStat.IsDir()) }package main import ( "fmt" "log" "os" ) func main() { fileStat, err := os.Stat("test.txt") if err != nil { log.Fatal(err) } fmt.Println("File Name:", fileStat.Name()) fmt.Println("Size:", fileStat.Size()) fmt.Println("Permissions:", fileStat.Mode()) fmt.Println("Last Modified:", fileStat.ModTime()) fmt.Println("Is Directory: ", fileStat.IsDir()) }
Output :
PS C:\GO_Language\file> go run matadata.goFile Name: test.txtSize: 59Permissions: -rw-rw-rw-Last Modified: 2022-08-20 15:39:48.8907731 +0530 ISTIs Directory: falsePS C:\GO_Language\file> go run matadata.go File Name: test.txt Size: 59 Permissions: -rw-rw-rw- Last Modified: 2022-08-20 15:39:48.8907731 +0530 IST Is Directory: falsePS C:\GO_Language\file> go run matadata.go File Name: test.txt Size: 59 Permissions: -rw-rw-rw- Last Modified: 2022-08-20 15:39:48.8907731 +0530 IST Is Directory: false
-
Deleting a specific file
package mainimport ("log""os")func main() {err := os.Remove("C:/GO_Language/test.txt ")if err != nil {log.Fatal(err)}}package main import ( "log" "os" ) func main() { err := os.Remove("C:/GO_Language/test.txt ") if err != nil { log.Fatal(err) } }package main import ( "log" "os" ) func main() { err := os.Remove("C:/GO_Language/test.txt ") if err != nil { log.Fatal(err) } }
Output :
PS C:\GO_Language\file> go run delete.goPS C:\GO_Language\file> go run delete.goPS C:\GO_Language\file> go run delete.go
-
Read a text file character by character
package mainimport ("bufio""fmt""io/ioutil""os""strings")func main() {filename := "test.txt"filebuffer, err := ioutil.ReadFile(filename)if err != nil {fmt.Println(err)os.Exit(1)}inputdata := string(filebuffer)data := bufio.NewScanner(strings.NewReader(inputdata))data.Split(bufio.ScanRunes)for data.Scan() {fmt.Print(data.Text())}}package main import ( "bufio" "fmt" "io/ioutil" "os" "strings" ) func main() { filename := "test.txt" filebuffer, err := ioutil.ReadFile(filename) if err != nil { fmt.Println(err) os.Exit(1) } inputdata := string(filebuffer) data := bufio.NewScanner(strings.NewReader(inputdata)) data.Split(bufio.ScanRunes) for data.Scan() { fmt.Print(data.Text()) } }package main import ( "bufio" "fmt" "io/ioutil" "os" "strings" ) func main() { filename := "test.txt" filebuffer, err := ioutil.ReadFile(filename) if err != nil { fmt.Println(err) os.Exit(1) } inputdata := string(filebuffer) data := bufio.NewScanner(strings.NewReader(inputdata)) data.Split(bufio.ScanRunes) for data.Scan() { fmt.Print(data.Text()) } }
Output :
PS C:\GO_Language\file> go run readchar.goSandeepRameshShankarMohandhanajiRajyaSohelPS C:\GO_Language\file> go run readchar.go Sandeep Ramesh Shankar Mohan dhanaji Rajya SohelPS C:\GO_Language\file> go run readchar.go Sandeep Ramesh Shankar Mohan dhanaji Rajya Sohel
-
Truncate File Content
package mainimport ("log""os")func main() {err := os.Truncate("test.txt", 100)if err != nil {log.Fatal(err)}}package main import ( "log" "os" ) func main() { err := os.Truncate("test.txt", 100) if err != nil { log.Fatal(err) } }package main import ( "log" "os" ) func main() { err := os.Truncate("test.txt", 100) if err != nil { log.Fatal(err) } }
PS C:\GO_Language\file> go run truncate.goPS C:\GO_Language\file> go run truncate.goPS C:\GO_Language\file> go run truncate.go
-
Append Content in a Text File
package mainimport ("fmt""os")func main() {msg := "Add this content at end"fname := "test.txt"f, err := os.OpenFile(fname, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0660)if err != nil {fmt.Println(err)os.Exit(-1)}defer f.Close()fmt.Fprintf(f, "%s\n", msg)}package main import ( "fmt" "os" ) func main() { msg := "Add this content at end" fname := "test.txt" f, err := os.OpenFile(fname, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0660) if err != nil { fmt.Println(err) os.Exit(-1) } defer f.Close() fmt.Fprintf(f, "%s\n", msg) }package main import ( "fmt" "os" ) func main() { msg := "Add this content at end" fname := "test.txt" f, err := os.OpenFile(fname, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0660) if err != nil { fmt.Println(err) os.Exit(-1) } defer f.Close() fmt.Fprintf(f, "%s\n", msg) }
Output :
PS C:\GO_Language\file> go run append.goPS C:\GO_Language\file> go run append.goPS C:\GO_Language\file> go run append.go
-
Change file permission, ownership, and timestamps
package mainimport ("log""os""time")func main() {_, err := os.Stat("test.txt")if err != nil {if os.IsNotExist(err) {log.Fatal("File does not exist.")}}log.Println("File exist.")// Change permissions Linux.err = os.Chmod("test.txt", 0777)if err != nil {log.Println(err)}// Change file ownership.err = os.Chown("test.txt", os.Getuid(), os.Getgid())if err != nil {log.Println(err)}// Change file timestamps.addOneDayFromNow := time.Now().Add(24 * time.Hour)lastAccessTime := addOneDayFromNowlastModifyTime := addOneDayFromNowerr = os.Chtimes("test.txt", lastAccessTime, lastModifyTime)if err != nil {log.Println(err)}}package main import ( "log" "os" "time" ) func main() { _, err := os.Stat("test.txt") if err != nil { if os.IsNotExist(err) { log.Fatal("File does not exist.") } } log.Println("File exist.") // Change permissions Linux. err = os.Chmod("test.txt", 0777) if err != nil { log.Println(err) } // Change file ownership. err = os.Chown("test.txt", os.Getuid(), os.Getgid()) if err != nil { log.Println(err) } // Change file timestamps. addOneDayFromNow := time.Now().Add(24 * time.Hour) lastAccessTime := addOneDayFromNow lastModifyTime := addOneDayFromNow err = os.Chtimes("test.txt", lastAccessTime, lastModifyTime) if err != nil { log.Println(err) } }package main import ( "log" "os" "time" ) func main() { _, err := os.Stat("test.txt") if err != nil { if os.IsNotExist(err) { log.Fatal("File does not exist.") } } log.Println("File exist.") // Change permissions Linux. err = os.Chmod("test.txt", 0777) if err != nil { log.Println(err) } // Change file ownership. err = os.Chown("test.txt", os.Getuid(), os.Getgid()) if err != nil { log.Println(err) } // Change file timestamps. addOneDayFromNow := time.Now().Add(24 * time.Hour) lastAccessTime := addOneDayFromNow lastModifyTime := addOneDayFromNow err = os.Chtimes("test.txt", lastAccessTime, lastModifyTime) if err != nil { log.Println(err) } }
Output :
PS C:\GO_Language\file> go run change.go2022/08/20 16:55:42 File exist.2022/08/20 16:55:42 chown test.txt: not supported by windowsPS C:\GO_Language\file> go run change.go 2022/08/20 16:55:42 File exist. 2022/08/20 16:55:42 chown test.txt: not supported by windowsPS C:\GO_Language\file> go run change.go 2022/08/20 16:55:42 File exist. 2022/08/20 16:55:42 chown test.txt: not supported by windows
-
Compress a list of files into a ZIP file
package mainimport ("archive/zip""fmt""io""log""os")func appendFiles(fname string, zipw *zip.Writer) error {file, err := os.Open(fname)if err != nil {return fmt.Errorf("Failed to open %s: %s", fname, err)}defer file.Close()wr, err := zipw.Create(fname)if err != nil {msg := "Failed to create entry for %s in zip file: %s"return fmt.Errorf(msg, fname, err)}if _, err := io.Copy(wr, file); err != nil {return fmt.Errorf("Failed to write %s to zip: %s", fname, err)}return nil}func main() {flags := os.O_WRONLY | os.O_CREATE | os.O_TRUNCfile, err := os.OpenFile("test.zip", flags, 0644)if err != nil {log.Fatalf("Failed to open zip for writing: %s", err)}defer file.Close()var files = []string{"test1.txt", "test2.txt", "test3.txt"}zipw := zip.NewWriter(file)defer zipw.Close()for _, filename := range files {if err := appendFiles(filename, zipw); err != nil {log.Fatalf("Failed to add file %s to zip: %s", fname, err)}}}package main import ( "archive/zip" "fmt" "io" "log" "os" ) func appendFiles(fname string, zipw *zip.Writer) error { file, err := os.Open(fname) if err != nil { return fmt.Errorf("Failed to open %s: %s", fname, err) } defer file.Close() wr, err := zipw.Create(fname) if err != nil { msg := "Failed to create entry for %s in zip file: %s" return fmt.Errorf(msg, fname, err) } if _, err := io.Copy(wr, file); err != nil { return fmt.Errorf("Failed to write %s to zip: %s", fname, err) } return nil } func main() { flags := os.O_WRONLY | os.O_CREATE | os.O_TRUNC file, err := os.OpenFile("test.zip", flags, 0644) if err != nil { log.Fatalf("Failed to open zip for writing: %s", err) } defer file.Close() var files = []string{"test1.txt", "test2.txt", "test3.txt"} zipw := zip.NewWriter(file) defer zipw.Close() for _, filename := range files { if err := appendFiles(filename, zipw); err != nil { log.Fatalf("Failed to add file %s to zip: %s", fname, err) } } }package main import ( "archive/zip" "fmt" "io" "log" "os" ) func appendFiles(fname string, zipw *zip.Writer) error { file, err := os.Open(fname) if err != nil { return fmt.Errorf("Failed to open %s: %s", fname, err) } defer file.Close() wr, err := zipw.Create(fname) if err != nil { msg := "Failed to create entry for %s in zip file: %s" return fmt.Errorf(msg, fname, err) } if _, err := io.Copy(wr, file); err != nil { return fmt.Errorf("Failed to write %s to zip: %s", fname, err) } return nil } func main() { flags := os.O_WRONLY | os.O_CREATE | os.O_TRUNC file, err := os.OpenFile("test.zip", flags, 0644) if err != nil { log.Fatalf("Failed to open zip for writing: %s", err) } defer file.Close() var files = []string{"test1.txt", "test2.txt", "test3.txt"} zipw := zip.NewWriter(file) defer zipw.Close() for _, filename := range files { if err := appendFiles(filename, zipw); err != nil { log.Fatalf("Failed to add file %s to zip: %s", fname, err) } } }
Output :
PS C:\GO_Language\file> go run compress.goPS C:\GO_Language\file> go run compress.goPS C:\GO_Language\file> go run compress.go
-
Extract or Unzip
package mainimport ("archive/zip""io""log""os""path/filepath")func main() {zipReader, _ := zip.OpenReader("test.zip")for _, file := range zipReader.Reader.File {zippedFile, err := file.Open()if err != nil {log.Fatal(err)}defer zippedFile.Close()tDir := "./"extractedFilePath := filepath.Join(tDir,file.Name,)if file.FileInfo().IsDir() {log.Println("Directory Created:", extractedFilePath)os.MkdirAll(extractedFilePath, file.Mode())} else {log.Println("File extracted:", file.Name)opFile, err := os.OpenFile(extractedFilePath,os.O_WRONLY|os.O_CREATE|os.O_TRUNC,file.Mode(),)if err != nil {log.Fatal(err)}defer opFile.Close()_, err = io.Copy(opFile, zippedFile)if err != nil {log.Fatal(err)}}}}package main import ( "archive/zip" "io" "log" "os" "path/filepath" ) func main() { zipReader, _ := zip.OpenReader("test.zip") for _, file := range zipReader.Reader.File { zippedFile, err := file.Open() if err != nil { log.Fatal(err) } defer zippedFile.Close() tDir := "./" extractedFilePath := filepath.Join( tDir, file.Name, ) if file.FileInfo().IsDir() { log.Println("Directory Created:", extractedFilePath) os.MkdirAll(extractedFilePath, file.Mode()) } else { log.Println("File extracted:", file.Name) opFile, err := os.OpenFile( extractedFilePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, file.Mode(), ) if err != nil { log.Fatal(err) } defer opFile.Close() _, err = io.Copy(opFile, zippedFile) if err != nil { log.Fatal(err) } } } }package main import ( "archive/zip" "io" "log" "os" "path/filepath" ) func main() { zipReader, _ := zip.OpenReader("test.zip") for _, file := range zipReader.Reader.File { zippedFile, err := file.Open() if err != nil { log.Fatal(err) } defer zippedFile.Close() tDir := "./" extractedFilePath := filepath.Join( tDir, file.Name, ) if file.FileInfo().IsDir() { log.Println("Directory Created:", extractedFilePath) os.MkdirAll(extractedFilePath, file.Mode()) } else { log.Println("File extracted:", file.Name) opFile, err := os.OpenFile( extractedFilePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, file.Mode(), ) if err != nil { log.Fatal(err) } defer opFile.Close() _, err = io.Copy(opFile, zippedFile) if err != nil { log.Fatal(err) } } } }
Output :
PS C:\GO_Language\file> go run extract.go2022/08/20 17:11:43 File extracted: test1.txt2022/08/20 17:11:43 File extracted: test2.txt2022/08/20 17:11:43 File extracted: test3.txtPS C:\GO_Language\file> go run extract.go 2022/08/20 17:11:43 File extracted: test1.txt 2022/08/20 17:11:43 File extracted: test2.txt 2022/08/20 17:11:43 File extracted: test3.txtPS C:\GO_Language\file> go run extract.go 2022/08/20 17:11:43 File extracted: test1.txt 2022/08/20 17:11:43 File extracted: test2.txt 2022/08/20 17:11:43 File extracted: test3.txt
-