美文网首页
Go 语言学习笔记-文件操作

Go 语言学习笔记-文件操作

作者: 梁坤同学 | 来源:发表于2020-04-12 15:49 被阅读0次

    打开、创建文件

    • 创建文件 Create

      file, err := os.Create("F:/futureWeb/goLang/testFile.go")
      
      • 参数:name。打开文件的路径:绝对路径、相对路径
      • 目录分隔符:/
      • 文件不存在,则创建。文件存在,则将文件内容清空。
    • 打开文件 Open

      • 参数:name。打开文件的路径:绝对路径、相对路径
      • 以只读方式打开文件。文件不存在,则打开失败。
      f, err := os.Open("F:/futureWeb/goLang/testFile.go")
      
    • 打开文件 OpenFile

      f, err := os.OpenFile("F:/futureWeb/goLang/testFile.go", os.O_RDONLY, 6)
      
      • 参数1:name。打开文件的路径:绝对路径、相对路径
      • 参数2:打开文件权限:O_RDONLY(只读模式)、O_WRONLY(只写模式)、O_RDWR(可读可写模式)、O_APPEND(追加模式)。
      • 参数3:perm,表权限取值范围(0-7)一般传 6
        • 0:没有任何权限
        • 1:执行权限(如果是可执行文件,是可以运行的)
        • 2:写权限
        • 3:写权限与执行权限
        • 4:读权限
        • 5:读权限与执行权限
        • 6:读权限与写权限
        • 7:读权限、写权限、执行权限

    写文件

    • 按字符串写:

      n, err := f.WriteString("123")
      
      • n:写入的字符个数
      • 回车换行:windows: \r\n, Linux: \n
    • 按位置写:

        off, _ := f.Seek(10, io.SeekEnd)
      
      • 参数1:偏移量。正:向文件未偏,负:向文件头偏
      • 参数2:偏移起始位置
        • io.SeekStart:文件起始位置
        • io.SeekCurrent:文件当前位置
        • io.SeekEnd:文件结尾位置
      • 返回值:表示从文件起始位置,到当前读写指针位置的偏移量
    • 按字节写:

        n, _ := f.WriteAt([]byte("111"), 10)
      
      • WriteAt():在文件指定偏移位置,写入 []byte, 通常搭配 Seek()
      • 参数1:待写入数据
      • 参数2:偏移量
      • 返回值:实际写出的字节数

    读文件

    • 按行读

      1. 创建一个带有缓冲区的 Reader(读写器)

        reader := bufio.NewReader(f)  // f: 打开的文件指针
        
      2. 从 Reader 的缓冲区中,读取指定长度的数据。数据长度取决于 参数(dlime)

        buf, er := reader.ReadBytes('\n')   // 按行读 
        

      判断到达文件结尾:if err != nil && err == io.EOF 到文件结尾
      文件结尾标识是要单独读一次获取到的。

      缓冲区:内存中的一块区域,用来减少物理磁盘访问操作。

    • 按字节读文件

      read([]byte)
      

    删文件

    • Remove
      func Remove(name string) Error
    

    调用该函数就可以删除文件名为 name 的文件

    目录操作

    • 打开目录:os.OpenFile

      f, err := os.OpenFile(path, os.O_WRONLY, os.ModeDir)
      
      • 打开目录 OpenFile:以只读方式打开目录。
      • 参数1:name,打开目录的路径:绝对路径、相对路径
      • 参数2:打开目录权限:O_RDONLY
      • 参数3:os.ModeDir
      • 返回值:返回一个可以读目录的文件指针
    • 读目录:Readdir

      info, err := f.Readdir(-1)
      
      • 参数:想要打开的目录项个数。-1,表示所有。
      • 返回值:FileInfo
      • 原型:
        type FileInfo interface {
          Name() string   // base name of the file
          Size() int64    // length in bytes for regular files; system-dependent for others
          Mode() FileMode // file mode bits
          ModTime() time.Time // modification time
          IsDir() bool  // abbreviation for Mode().IsDir()
          Sys() interface{}  // underlying data source (can return nil)
        }
        
        func(f *File) Readdir(n int) ([]FileInfo, err) {
          FileInfo
        }
        
    • 直接读目录:ioutil.ReadDir

      info, err := ioutil.ReadDir(path)
      
      • 参数:path,打开目录的路径:绝对路径、相对路径
    • 其他目录操作

      • 将当前工作目录修改为 dir 指定的目录

        func Chdir(dir string) error
        
      • 返回当前工作目录的绝对路径

        func Getwd(dir string, err error)
        
      • 使用指定的权限和名称创建一个目录

        func MKdir(name string, perm FileMode) error
        

    使用案例:查询单词在目录中出现的次数

    package main
    
    import (
        "bufio"
        "fmt"
        "io"
        "io/ioutil"
        "os"
        "strings"
    )
    
    func readFile(path, word string) int {
        fp, err := os.Open(path)
        if err != nil {
            fmt.Println("Open error: ", err)
        }
        defer fp.Close()
    
        row := bufio.NewReader(fp)      // 创建一个reader
        var total int = 0       // 统计单词总数的变量
    
        for {
            buf, err := row.ReadBytes('\n')
            if err != nil && err == io.EOF {
                break
            }
            total += wordCount(string(buf[:]), word)
        }
        return total
    }
    
    func wordCount(s, word string) int {
        arr := strings.Fields(s)    //分割字符串,存入数组
    
        m := make(map[string]int)
    
        //对 arr 中的每个单词进行循环,存入 map 中统计
        for i := 0; i < len(arr); i++ {
            m[arr[i]] ++
        }
    
        for k, v := range m {
            if k == word {
                fmt.Printf("%s : %d\n", k, v)
                return m[k]
            }
        }
        return 0
    }
    
    //从一个文件中逐行读取内容,统计该文件共有多少个单词
    func main() {
        fmt.Println("请输入需要查询的目录:")
        var path string     // 获取用户指定的目录名
        fmt.Scan(&path)
        fmt.Println("请输入需要查询的单词:")
        var word string     // 获取用户指定的单词
        fmt.Scan(&word)
    
        if !strings.HasSuffix(path, "/") {
            path += "/"
        }
    
        fileList, _ := ioutil.ReadDir(path)
    
        var allCount int = 0
        for _, fileInfo := range fileList {
            if !fileInfo.IsDir() {
                s := fileInfo.Name()
                if strings.HasSuffix(s, ".txt") {
                    allCount += readFile(path + s, word)
                }
            }
        }
        fmt.Printf("目录所有文件中共有 %d 个 %s", allCount, word)
    }
    

    https://studygolang.com/pkgdoc

    相关文章

      网友评论

          本文标题:Go 语言学习笔记-文件操作

          本文链接:https://www.haomeiwen.com/subject/dzxbmhtx.html