Go_文件操作
使用OS操作文件
读写示例
package main import ( "os" "fmt" ) func main(){ f, _ := os.OpenFile(`C:\Users\asus\Desktop\aa.txt`,os.O_WRONLY, 0777 ) defer f.Close() f.Write([]byte("叫爸爸")) // 将字节写入文件中 f1, _ := os.Open(`C:\Users\asus\Desktop\aa.txt`) f1.Close() var b = make([]byte, 20) c,_ := f1.Read(b) // 读取文件字节至b切片中 fmt.Println(c) fmt.Println(b) str := string(b) fmt.Println(str) }
相关常量及File的方法
先介绍打开文件的方法参数及返回值
func Open(name string) (*File, error) { return OpenFile(name, O_RDONLY, 0) // 只读 } func OpenFile(name string, flag int, perm FileMode) (*File, error) { pass } // name 文件名 // flag 打开方式 //模式常量/ 可以使用|隔开来实现两个 //os.O_WRONLY: 只写 //os.O_CREATE: 创建 //os.O_RDONLY : 只读 //os.O_RDWR : 读写 //os.O_TRUNC : 清空 //perm linux中的权限
File结构体的方法
//写入一个slice,返回写的个数,错误信息,通过File的内存地址调用 func (file *File)Write(b []byte)(n int,err Error) //从slice的某个位置开始写入,返回写的个数,错误信息,通过File的内存地址调用 func (file *File)WriteAt(b []byte,off int64)(n int,err Error) //写入一个字符串,返回写的个数,错误信息,通过File的内存地址调用 func (file *File) WriteString(s string)(ret int,err Error) //读取一个slice,返回读的个数,错误信息,通过File的内存地址调用 func (file *File) Read(b []byte)(n int, err Error) //从slice的某个位置开始读取,返回读到的个数,错误信息,通过File的内存地址调用 func (file *File) ReadAt(b []byte,off int64)(n int,err Error)
os下的其他方法
// 打开两个文件, 拷贝 func Copy(dst Writer, src Reader) (written int64, err error) {} // 创建文件 func Create(name string) (*File, error) {} // 内部也是OpenFile // Truncate文件 // 裁剪一个文件到100个字节。 // 如果文件本来就少于100个字节,则文件中原始内容得以保留,剩余的字节以null字节填充。 func Truncate(name string, size int64) error {} //得到文件信息 // 如果文件不存在,则返回错误 fileInfo, err = os.Stat("test.txt") if err != nil { log.Fatal(err) } fmt.Println("File name:", fileInfo.Name()) fmt.Println("Size in bytes:", fileInfo.Size()) fmt.Println("Permissions:", fileInfo.Mode()) fmt.Println("Last modified:", fileInfo.ModTime()) fmt.Println("Is Directory: ", fileInfo.IsDir()) fmt.Printf("System interface type: %T\n", fileInfo.Sys()) fmt.Printf("System info: %+v\n\n", fileInfo.Sys()) // 重命名和移动 originalPath := "test.txt" newPath := "test2.txt" err := os.Rename(originalPath, newPath) if err != nil { log.Fatal(err) } // 删除文件 err := os.Remove("test.txt") if err != nil { log.Fatal(err) } // 改变权限 // 使用Linux风格改变文件权限 err := os.Chmod("test.txt", 0777) if err != nil { log.Println(err) } // 改变文件所有者 err = os.Chown("test.txt", os.Getuid(), os.Getgid()) if err != nil { log.Println(err) } // 改变时间戳 twoDaysFromNow := time.Now().Add(48 * time.Hour) lastAccessTime := twoDaysFromNow lastModifyTime := twoDaysFromNow err = os.Chtimes("test.txt", lastAccessTime, lastModifyTime) if err != nil { log.Println(err) } // 跳转到文件制定位置 file, _ := os.Open("test.txt") defer file.Close() // 偏离位置,可以是正数也可以是负数 var offset int64 = 5 // 用来计算offset的初始位置 // 0 = 文件开始位置 // 1 = 当前位置 // 2 = 文件结尾处 var whence int = 0 newPosition, err := file.Seek(offset, whence) if err != nil { log.Fatal(err) } fmt.Println("Just moved to 5:", newPosition) // 从当前位置回退两个字节 newPosition, err = file.Seek(-2, 1) if err != nil { log.Fatal(err) } fmt.Println("Just moved back two:", newPosition) // 使用下面的技巧得到当前的位置 currentPosition, err := file.Seek(0, 1) fmt.Println("Current position:", currentPosition) // 转到文件开始处 newPosition, err = file.Seek(0, 0) if err != nil { log.Fatal(err) } fmt.Println("Position after seeking 0,0:", newPosition)
ioutil包
写文件
// func WriteFile(filename string, data []byte, perm os.FileMode) error {} package main import ( "io/ioutil" "log" ) func main() { err := ioutil.WriteFile("test.txt", []byte("Hi\n"), 0666) if err != nil { log.Fatal(err) } }
读文件
// ioutil.ReadAll()会读取reader(r)的每一个字节,然后把字节slice返回。 func ReadAll(r io.Reader) ([]byte, error) {} // 快速读到内存 func ReadFile(filename string) ([]byte, error) {}
使用bufio读写文件
bufio 用来帮助处理 I/O 缓存。 我们将通过一些示例来熟悉其为我们提供的:Reader, Writer and Scanner 等一系列功能
写文件
// func NewWriter(w io.Writer) *Writer {} w是一个接口 file, err := os.OpenFile("test.txt", os.O_WRONLY, 0666) if err != nil { log.Fatal(err) } defer file.Close() // 为这个文件创建buffered writer bufferedWriter := bufio.NewWriter(file) // 写字节到buffer bytesWritten, err := bufferedWriter.Write( []byte{65, 66, 67}, ) // 写字符串到buffer // 也可以使用 WriteRune() 和 WriteByte() bytesWritten, err = bufferedWriter.WriteString( "Buffered string\n", ) // 写内存buffer到硬盘 bufferedWriter.Flush() // 检查缓存中的字节数 unflushedBufferSize := bufferedWriter.Buffered() log.Printf("Bytes buffered: %d\n", unflushedBufferSize) // 还有多少字节可用(未使用的缓存大小) bytesAvailable := bufferedWriter.Available()
读文件
// 打开文件,创建buffered reader file, err := os.Open(`C:\Users\asus\Desktop\aa.txt`) if err != nil { log.Fatal(err) } bufferedReader := bufio.NewReader(file) // 重点一, 读取到分隔符,包含分隔符,返回byte slice dataBytes, err := bufferedReader.ReadBytes('\n') if err != nil { log.Fatal(err) } fmt.Printf("Read bytes: %s\n", dataBytes) // 重点二, 读取到分隔符,包含分隔符,返回字符串 dataString, err := bufferedReader.ReadString('\n') if err != nil { log.Fatal(err) } fmt.Printf("Read string: %s\n", dataString) // 得到字节,当前指针不变seek byteSlice := make([]byte, 5) byteSlice, err = bufferedReader.Peek(5) if err != nil { log.Fatal(err) } fmt.Printf("Peeked at 5 bytes: %s\n", byteSlice) // 读取,指针同时移动 numBytesRead, err := bufferedReader.Read(byteSlice) if err != nil { log.Fatal(err) } fmt.Printf("Read %d bytes: %s\n", numBytesRead, byteSlice) // 读取一个字节, 如果读取不成功会返回Error myByte, err := bufferedReader.ReadByte() if err != nil { log.Fatal(err) } fmt.Printf("Read 1 byte: %c\n", myByte)