1. 创建文件
func main() {
// 创建文件
f, err := os.Create("asong.txt")
if err != nil {
log.Fatalf("create file failed err=%s\n", err)
}
}
- 参数传 绝对路径 和 相对路径 都可以
- 如果原来的文件存在, 就创建一个空文件覆盖它
2. 打开文件
//以只读方式打开文件
func main() {
//打开文件
file, err := os.Open("/yourPath/test.txt")
if err != nil {
panic(err.Error())
}
//关闭文件
defer file.Close()
}
//可以是读写方式打开文件, 或者有一些其他操作, 没有文件的时候直接创建文件
func main() {
//打开文件
f, _ := os.OpenFile("F:\\goworkspace\\caixukun\\a.txt", os.O_WRONLY|os.O_CREATE, 0666)
//关闭文件
defer file.Close()
}
3. 获取文件信息
func main() {
// 打开文件
f, err := os.Open("F:\\goworkspace\\caixukun\\b.txt")
if err != nil {
log.Fatalf("create file failed err=%s\n", err)
}
fileInfo, err := f.Stat()
if err != nil {
log.Fatalf("get file info failed err=%s\n", err)
}
fmt.Println("IsDir = ", fileInfo.IsDir())
fmt.Println("ModTime = ", fileInfo.ModTime())
fmt.Println("Mode = ", fileInfo.Mode())
fmt.Println("Name = ", fileInfo.Name())
fmt.Println("Size = ", fileInfo.Size())
fmt.Println("Sys = ", fileInfo.Sys())
}
4. 改变文件权限
func main() {
// 打开文件
f, err := os.Open("F:\\goworkspace\\caixukun\\b.txt")
if err != nil {
log.Fatalf("create file failed err=%s\n", err)
}
err = f.Chmod(0777)
if err != nil{
log.Fatalf("chmod file failed err=%s\n", err)
}
// 改变拥有者
err = f.Chown(os.Getuid(), os.Getgid())
if err != nil{
log.Fatalf("chown file failed err=%s\n", err)
}
}
5. 删除文件
func main() {
// 删除文件
err = os.Remove("asong.txt")
if err != nil{
log.Fatalf("remove file failed err=%s\n", err)
}
}
6. 写文件
6.1 快速写
func main() {
err := os.WriteFile("F:\\goworkspace\\caixukun\\b.txt", []byte("一段二进制数据"), 0666)
}
//os与ioutil是一样的东西
//建议不要使用ioutil; go官方会逐渐废弃不再维护
func main() {
ioutil.WriteFile("F:\\goworkspace\\caixukun\\d.txt", []byte("66"), 0666)
}
- 如果文件不存在则自动创建文件后写入
- 写入是覆盖写入, 文件原有的数据则会被删除
6.2 按行写文件
func main() {
// 打开文件
f, err := os.OpenFile(filename, os.O_WRONLY, 0666)
_,err := f.WriteString(line + "\n")
}
- 必须先有文件才能按行写入
- 如果文件里已经有内容了, 则会从第1个字符 开始逐一覆盖字符, 超过原来的字符数量追加在后面
6.3 使用缓冲区写入
func main() {
f, _ := os.OpenFile("F:\\goworkspace\\caixukun\\c.txt", os.O_WRONLY, 0666)
// 为这个文件创建buffered writer
bufferedWriter := bufio.NewWriter(f)
for i := 0; i < 10; i++ {
// 写字符串到buffer
bytesWritten, err := bufferedWriter.WriteString(strconv.Itoa(i))
if err != nil {
return
}
log.Printf("Bytes written: %d\n", bytesWritten)
}
// 写内存buffer到硬盘
if err := bufferedWriter.Flush(); err != nil {
panic(err)
}
defer f.Close()
}
- 与按行写行为一致
- 必须先有文件才能按行写入
- 如果文件里已经有内容了, 则会从第1个字符 开始逐一覆盖字符, 超过原来的字符数量追加在后面
6.4 偏移量写入
func main() {
f, _ := os.OpenFile("F:\\goworkspace\\caixukun\\b.txt", os.O_WRONLY, 0666)
replaceSplace := []byte{
0x6F, // o
0x6E, // n
}
f.WriteAt(replaceSplace, 2) //第二个入参是偏移量, 会直接覆盖
f.Close()
}
- 可以做追加写操作
6.5 追加写
func main() {
f, _ := os.OpenFile("F:\\goworkspace\\caixukun\\b.txt", os.O_WRONLY|os.O_APPEND, 0666)
f.Write([]byte("---追加的内容---"))
f.Close()
}
6.6 创建并写入文件
func main() {
//第二个参数可以设置多个功能
f, _ := os.OpenFile("F:\\goworkspace\\caixukun\\a.txt", os.O_WRONLY|os.O_CREATE, 0666)
f.WriteString("写入的文字")
f.Close()
}
详细请看
7. 读取文件
7.1 读取全部内容
func main() {
filename := "F:\\goworkspace\\caixukun\\a.txt"
data, _ := os.ReadFile(filename)
fmt.Println(string(data))
}
//建议不要使用ioutil
func main() {
filename := "F:\\goworkspace\\caixukun\\a.txt"
file, _ := os.Open(filename)
data, _ := ioutil.ReadAll(file)
fmt.Println(string(data))
}
7.2 按行读取文件
官方推荐按行读取使用 scanner
func main() {
filename := "F:\\goworkspace\\caixukun\\a.txt"
file, _ := os.Open(filename)
defer file.Close()
scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanLines) //可省略, 默认就是按行读取
for scanner.Scan() {
line := scanner.Text()
fmt.Printf("%s\n", line)
}
if err := scanner.Err(); err != nil {
log.Printf("Cannot scanner text file: %s, err: [%v]", filename, err)
return
}
return
}
7.3 按块读取文件
func main() {
filename := "F:\\goworkspace\\caixukun\\a.txt"
file, _ := os.OpenFile(filename, os.O_RDONLY, 0666)
defer file.Close()
buf := make([]byte, 3) // 每次读取 3 个字节
for {
n, _ := file.Read(buf)
if n == 0 {
break
}
log.Printf("writeByte %s every read 2 byte is %s\n", filename, string(buf[:n]))
}
return
}
8. 复制文件
func main() {
//源文件
filename := "F:\\goworkspace\\caixukun\\a.txt"
file, _ := os.Open(filename)
defer file.Close()
//目标文件
newFile, _ := os.Create("F:\\goworkspace\\caixukun\\newFile.txt")
defer newFile.Close()
//复制操作
nBytes, _ := io.Copy(newFile, file) //注意两个参数的顺序
fmt.Printf("复制了 %d 字节数据", nBytes)
}