1.1.1. 一、打开文件的方式:

写文件的时候,要以写方式open文件。文档:https://golang.org/pkg/os/

使用的函数: func OpenFile(name string, flag int, perm FileMode) (*File, error)

参数:

  • name:文件的路径+名字。
  • int:文件的打开方式,只读 O_RDONLY 、只写 O_WRONLY、读写 O_RDWR 等(可以组合使用),如下 :
const (
    O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
    O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
    O_RDWR   int = syscall.O_RDWR   // 读写模式打开文件
    O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
    O_CREATE int = syscall.O_CREAT  // 如果不存在将创建一个新文件
    O_EXCL   int = syscall.O_EXCL   // 和O_CREATE配合使用,文件必须不存在
    O_SYNC   int = syscall.O_SYNC   // 打开文件用于同步I/O
    O_TRUNC  int = syscall.O_TRUNC  // 如果可能,打开时清空文件
)
  • perm :这个是控制文件的权限,在linux系统下有用。

1.1.2. 二、示例4种方式写文件:

1、创建一个文件,向文件里面写一些内容。

func main() {
    filePath := "C:/Users/Administrator/Desktop/testWrite.txt";
    // O_CREATE 如果不存在将创建一个新文件,并且以写(O_WRONLY)的方式打开文件
    // 0666 这个是文件的权限,所有者、所在组、其他人
    file, err := os.OpenFile(filePath,os.O_WRONLY | os.O_CREATE,0666)
    if err != nil {
        fmt.Println("打开文件错误。。。")
        return
    }
    defer file.Close() //关闭文件

    writer := bufio.NewWriter(file)
    for i:=0; i<5; i++ {
        writer.WriteString("你好 \r\n")
    }

     // 因为 writer 带缓存,数据先写到writer中,超出缓存后才写到硬盘。
     // 所以最后需要把缓存中剩余的数据Flush()到硬盘
    writer.Flush()

}

使用到的API:

1、打开文件:os.OpenFile(filePath,os.O_WRONLY | os.O_CREATE,0666)

O_CREATE 如果不存在将创建一个新文件,并且以写(O_WRONLY)的方式打开文件。如果文件存在,将被覆盖。

0666 这个是文件的权限,是否目录,所有者、所在组、其他人。

2、关闭文件 :file.Close()。

3、创建写缓冲:bufio.NewWriter(file)

4、写文件内容:writer.WriteString("你好 \r\n")

5、把内容刷新到硬盘:writer.Flush(),因为 writer 带缓存,数据先写到writer中,超出缓存后才写到硬盘。所以最后需要把缓存中剩余的数据Flush()到硬盘。

2、打开一个已经存在的文件,清空原来的内容,然后向文件里面写数据。

如果已经知道文件存在,想覆盖原来的内容,可以使用下面的方式打开文件。(文件不存在,会出现err错误)

file, err := os.OpenFile(filePath,os.O_WRONLY | os.O_TRUNC,0666)

os.O_TRUNC 表示清空原来的内容。

3、向已经存在的文件末尾追加内容。

向已经存在的文件末尾追加内容,打开方式如下:(文件不存在,会出现err错误)

file, err := os.OpenFile(filePath,os.O_WRONLY | os.O_APPEND,0666)

os.O_APPEND 表示向末尾追加内容。

4、读取已经存在的文件,并且向文件末尾追加内容。

    filePath := "C:/Users/Administrator/Desktop/testWrite.txt";
    // O_CREATE
    file, err := os.OpenFile(filePath,os.O_RDWR | os.O_APPEND,0666)
    if err != nil {
        fmt.Println("打开文件错误。。。")
        return
    }
    defer file.Close() //关闭文件

    // 创建一个reader,默认带4096个字节的缓冲。
    reader := bufio.NewReader(file)
    //循环读取文件的内容
    for {
        // 读到一个换行\n就结束。当前只读取一行。存储到str变量。
        str, readErr := reader.ReadString('\n')

        fmt.Print(str) //输出读取到的内容
        if readErr == io.EOF { // io.EOF 表示文件末尾
            fmt.Println("读取完毕。。。。")
            break
        }

    }

    //  写文件
    writer := bufio.NewWriter(file)
    for i:=0; i<5; i++ {
        writer.WriteString("你好123tttxx追加 \r\n")
    }
     // 因为 writer 带缓存,数据先写到writer中,超出缓存后才写到硬盘。
     // 所以最后需要把缓存中剩余的数据Flush()到硬盘
    writer.Flush()

注意:读写os.O_RDWR 和 追加 os.O_APPEND,要先读,不能先写。如果先写文件,那读出来的是空字符串。

1.1.3. 三、从一个文件中读取内容,写入另一个文件。

使用 ioutil 包,把一个文件的内容读取出来,写入另一个文件。

    // 读文件
    data, err := ioutil.ReadFile("C:/Users/Administrator/Desktop/test.txt")
    if err != nil {
        fmt.Printf("读取文件失败。。。。%v",err)
    }

    // 写文件
    destPath := "C:/Users/Administrator/Desktop/dest.txt"
    writeErr := ioutil.WriteFile(destPath, data, 0666)
    if writeErr != nil {
        fmt.Printf("写文件失败。。。。%v",err)
    }

说明:

1、如果读取的文件 test.txt 不存在,会报 err 错误。

2、写的文件 dest.txt 可以不存在,如果文件 dest.txt 存在,原来的内容会被清空,写入新的内容。

1.1.4. 四、判断文件是否存在。

使用os.Stat 获取文件或文件夹的信息。如果有错误,判断是不是文件不存在os.IsNotExist 的错误。如下:

    info, err := os.Stat("C:/Users/Administrator/Desktop/test.txt")
    if err != nil { //有错误
        if os.IsNotExist(err) {
            fmt.Println("文件/目录 不存在。。。")
        }else {
            fmt.Println("其他错误 。。。")
        }
        return
    }
    fmt.Printf("文件名=%v \n",info.Name())
    fmt.Printf("文件大小=%v 字节\n",info.Size())
    fmt.Printf("是否文件夹=%v \n",info.IsDir())

说明:获取 文件/文件夹 信息的时候,如果有错,返回一个错误信息。判断这个错误信息是不是os.IsNotExist 来确定是否文件不存在引起的错误。

1.1.5. 五、拷贝文件。

可以使用 io 包的 func Copy(dst Writer, src Reader) (written int64, err error) 函数实现拷贝文件。返回拷贝的字节数,如果有错误返回遇到的第一个错误。

// 拷贝文件的函数
func CopyFile(dstFileName string, srcFileName string) (written int64, err error) {
    srcFile, err := os.Open(srcFileName)
    if err != nil {
        fmt.Printf("打开文件失败 err=%v\n", err)
        return
    }
    defer srcFile.Close()
    // 通 过 srcfile , 获 取 到 Reader
    reader := bufio.NewReader(srcFile)


    //打开 dstFileName
    dstFile, err := os.OpenFile(dstFileName, os.O_WRONLY | os.O_CREATE, 0666)
    if err != nil {
        fmt.Printf("打开文件失败 err=%v\n", err)
        return
    }
    // 通 过 dstFile, 获 取 到 Writer
    writer := bufio.NewWriter(dstFile)
    defer dstFile.Close()

    return io.Copy(writer, reader)
}
func main() {
    _, err := CopyFile("C:/Users/Administ1rator/Desktop/dstFile.jpg",
        "C:/Users/Administrator/Desktop/test.jpg")
    if err != nil {
        fmt.Printf("拷贝失败 err=%v \n", err)
    }
}

说明:主要是打开文件,并且把源文件的Reader、目标文件的 Writer 传递给io 包的

func Copy(dst Writer, src Reader) (written int64, err error)函数

results matching ""

    No results matching ""