Go语言中的文件操作

张开发
2026/4/5 11:22:55 15 分钟阅读

分享文章

Go语言中的文件操作
Go语言中的文件操作1. 文件操作的基本概念在Go语言中文件操作主要通过os、io、ioutilGo 1.16已移至io/fs和io等包来实现。文件操作包括文件的创建、打开和关闭文件的读取和写入文件的权限管理文件的元数据获取目录的操作2. 文件的创建与打开2.1 创建文件package main import ( fmt os ) func main() { // 创建文件 file, err : os.Create(example.txt) if err ! nil { fmt.Println(Error creating file:, err) return } defer file.Close() fmt.Println(File created successfully) }2.2 打开文件package main import ( fmt os ) func main() { // 打开文件只读 file, err : os.Open(example.txt) if err ! nil { fmt.Println(Error opening file:, err) return } defer file.Close() fmt.Println(File opened successfully) // 以读写模式打开文件 file2, err : os.OpenFile(example.txt, os.O_RDWR, 0644) if err ! nil { fmt.Println(Error opening file:, err) return } defer file2.Close() fmt.Println(File opened in read-write mode) }3. 文件的读取3.1 读取整个文件package main import ( fmt io os ) func main() { // 打开文件 file, err : os.Open(example.txt) if err ! nil { fmt.Println(Error opening file:, err) return } defer file.Close() // 读取文件内容 content, err : io.ReadAll(file) if err ! nil { fmt.Println(Error reading file:, err) return } fmt.Println(File content:, string(content)) }3.2 逐行读取package main import ( bufio fmt os ) func main() { // 打开文件 file, err : os.Open(example.txt) if err ! nil { fmt.Println(Error opening file:, err) return } defer file.Close() // 逐行读取 scanner : bufio.NewScanner(file) for scanner.Scan() { line : scanner.Text() fmt.Println(Line:, line) } if err : scanner.Err(); err ! nil { fmt.Println(Error scanning file:, err) } }3.3 按字节读取package main import ( fmt os ) func main() { // 打开文件 file, err : os.Open(example.txt) if err ! nil { fmt.Println(Error opening file:, err) return } defer file.Close() // 按字节读取 buffer : make([]byte, 1024) for { n, err : file.Read(buffer) if err ! nil { break } fmt.Print(string(buffer[:n])) } }4. 文件的写入4.1 写入字符串package main import ( fmt os ) func main() { // 打开文件写入模式 file, err : os.OpenFile(example.txt, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) if err ! nil { fmt.Println(Error opening file:, err) return } defer file.Close() // 写入字符串 _, err file.WriteString(Hello, World!\n) if err ! nil { fmt.Println(Error writing to file:, err) return } fmt.Println(Data written successfully) }4.2 写入字节package main import ( fmt os ) func main() { // 打开文件写入模式 file, err : os.OpenFile(example.txt, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) if err ! nil { fmt.Println(Error opening file:, err) return } defer file.Close() // 写入字节 data : []byte(Hello, World!\n) _, err file.Write(data) if err ! nil { fmt.Println(Error writing to file:, err) return } fmt.Println(Data written successfully) }4.3 追加写入package main import ( fmt os ) func main() { // 打开文件追加模式 file, err : os.OpenFile(example.txt, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644) if err ! nil { fmt.Println(Error opening file:, err) return } defer file.Close() // 追加写入 _, err file.WriteString(Append this line\n) if err ! nil { fmt.Println(Error appending to file:, err) return } fmt.Println(Data appended successfully) }5. 文件的元数据package main import ( fmt os time ) func main() { // 获取文件信息 info, err : os.Stat(example.txt) if err ! nil { fmt.Println(Error getting file info:, err) return } // 打印文件信息 fmt.Println(File name:, info.Name()) fmt.Println(File size:, info.Size(), bytes) fmt.Println(Is directory:, info.IsDir()) fmt.Println(Mode:, info.Mode()) fmt.Println(Modification time:, info.ModTime()) }6. 目录操作6.1 创建目录package main import ( fmt os ) func main() { // 创建目录 err : os.Mkdir(mydir, 0755) if err ! nil { fmt.Println(Error creating directory:, err) return } fmt.Println(Directory created successfully) // 创建嵌套目录 err os.MkdirAll(parent/child/grandchild, 0755) if err ! nil { fmt.Println(Error creating nested directories:, err) return } fmt.Println(Nested directories created successfully) }6.2 列出目录内容package main import ( fmt os ) func main() { // 列出目录内容 files, err : os.ReadDir(.) if err ! nil { fmt.Println(Error reading directory:, err) return } // 打印目录内容 for _, file : range files { if file.IsDir() { fmt.Printf([DIR] %s\n, file.Name()) } else { fmt.Printf([FILE] %s\n, file.Name()) } } }6.3 删除文件和目录package main import ( fmt os ) func main() { // 删除文件 err : os.Remove(example.txt) if err ! nil { fmt.Println(Error removing file:, err) return } fmt.Println(File removed successfully) // 删除目录 err os.Remove(mydir) if err ! nil { fmt.Println(Error removing directory:, err) return } fmt.Println(Directory removed successfully) // 删除嵌套目录 err os.RemoveAll(parent) if err ! nil { fmt.Println(Error removing nested directories:, err) return } fmt.Println(Nested directories removed successfully) }7. 文件权限package main import ( fmt os ) func main() { // 创建文件并设置权限 file, err : os.Create(example.txt) if err ! nil { fmt.Println(Error creating file:, err) return } defer file.Close() // 更改文件权限 err os.Chmod(example.txt, 0600) if err ! nil { fmt.Println(Error changing file permissions:, err) return } fmt.Println(File permissions changed successfully) }8. 实战应用8.1 复制文件package main import ( fmt io os ) func copyFile(src, dst string) error { // 打开源文件 srcFile, err : os.Open(src) if err ! nil { return err } defer srcFile.Close() // 创建目标文件 dstFile, err : os.Create(dst) if err ! nil { return err } defer dstFile.Close() // 复制内容 _, err io.Copy(dstFile, srcFile) return err } func main() { err : copyFile(source.txt, destination.txt) if err ! nil { fmt.Println(Error copying file:, err) return } fmt.Println(File copied successfully) }8.2 读取配置文件package main import ( bufio fmt os strings ) func readConfig(filePath string) (map[string]string, error) { config : make(map[string]string) // 打开文件 file, err : os.Open(filePath) if err ! nil { return nil, err } defer file.Close() // 读取配置 scanner : bufio.NewScanner(file) for scanner.Scan() { line : scanner.Text() // 跳过注释和空行 if strings.HasPrefix(line, #) || line { continue } // 解析键值对 parts : strings.SplitN(line, , 2) if len(parts) 2 { key : strings.TrimSpace(parts[0]) value : strings.TrimSpace(parts[1]) config[key] value } } return config, scanner.Err() } func main() { config, err : readConfig(config.txt) if err ! nil { fmt.Println(Error reading config:, err) return } fmt.Println(Config:, config) }8.3 写入日志文件package main import ( fmt os time ) func logMessage(filePath, message string) error { // 打开文件追加模式 file, err : os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644) if err ! nil { return err } defer file.Close() // 写入日志 timestamp : time.Now().Format(2006-01-02 15:04:05) logEntry : fmt.Sprintf([%s] %s\n, timestamp, message) _, err file.WriteString(logEntry) return err } func main() { err : logMessage(app.log, Application started) if err ! nil { fmt.Println(Error writing log:, err) return } fmt.Println(Log written successfully) }9. 总结使用os.Create()创建文件使用os.Open()打开文件只读使用os.OpenFile()打开文件可指定模式使用io.ReadAll()读取整个文件使用bufio.NewScanner()逐行读取文件使用file.WriteString()和file.Write()写入文件使用os.Stat()获取文件元数据使用os.Mkdir()和os.MkdirAll()创建目录使用os.ReadDir()列出目录内容使用os.Remove()和os.RemoveAll()删除文件和目录使用os.Chmod()更改文件权限注意使用defer file.Close()确保文件被正确关闭处理文件操作时的错误

更多文章