文件 io

作者: isuntong | 来源:发表于2020-03-17 14:29 被阅读0次

    文件操作

    package main
    
    import (
        "fmt"
        "os"
    )
    
    func main() {
        /*
        FileInfo:文件信息
            interface
                Name():文件名
                Size():文件大小,单位字节
                IsDir():是否为目录
                ModTime():修改时间
                Mode():权限
        */
        fileinfo,err := os.Stat("/Users/isuntong/Documents/test/a/abc.txt")
        if err != nil {
            fmt.Println("err:",err)
            return
        }
        fmt.Printf("%T\n",fileinfo) // *os.fileStat
    
        //文件名
        fmt.Println(fileinfo.Name()) //abc.txt
    
        //大小
        fmt.Println(fileinfo.Size()) //12
    
        //是不是目录
        fmt.Println(fileinfo.IsDir()) //false
    
        //修改时间
        fmt.Println(fileinfo.ModTime()) //2020-03-17 11:55:30.703993888 +0800 CST
    
        //权限
        fmt.Println(fileinfo.Mode()) //-rw-r--r--
    
    
    }
    
    package main
    
    import (
        "fmt"
        "os"
        "path"
        "path/filepath"
    )
    
    //4
    func main() {
        /*
        文件操作:
        1.路径:
            相对路径:relative
                相对于当前工程:abc.txt
            绝对路径:absolute
                /Users/isuntong/Documents/test/a/abc.txt
    
            .当前目录
            ..上一层
        */
        //1。路径
        fileName1 := "/Users/isuntong/Documents/test/a/abc.txt"
        fileName2 := "ab.txt"
        //是否是绝对路径
        fmt.Println(filepath.IsAbs(fileName1)) //true
        fmt.Println(filepath.IsAbs(fileName2)) //false
        fmt.Println(filepath.Abs(fileName1)) ///Users/isuntong/Documents/test/a/abc.txt <nil>
        fmt.Println(filepath.Abs(fileName2)) ///Users/isuntong/go/src/demo/ab.txt <nil>
    
        fmt.Println("获取父目录:",path.Join(fileName1,"..")) //获取父目录: /Users/isuntong/Documents/test/a
    
        //2. 创建目录 os.ModePerm权限
        err := os.Mkdir("/Users/isuntong/Documents/test/a/bb",os.ModePerm)
        if err != nil {
            fmt.Println("err:",err)
            // return
        }
        fmt.Println("文件夹创建成功")
    
        err2 := os.MkdirAll("/Users/isuntong/Documents/test/a/cc/dd/ee",os.ModePerm)
        if err2 != nil {
            fmt.Println("err:",err2)
            // return
        }
        fmt.Println("多层文件夹创建成功")
    
        //3。 创建文件 不存在创建,存在使其变为空
        file1,err3 := os.Create("/Users/isuntong/Documents/test/a/ab.txt")
        if err3 != nil {
            fmt.Println("err:",err3)
            // return
        }
        fmt.Println(file1) //&{0xc0000b2120}
    
        //4。 打开文件 让当前程序和指定文件之间简历连接
        //os.open(filename)
        //os.openFile(filename,mode,perm)
        file3,err := os.Open(fileName1)
        fmt.Println(file3) //&{0xc000132180}
    
        file4,err := os.OpenFile(fileName1,os.O_RDONLY|os.O_WRONLY,os.ModePerm)
        fmt.Println(file4)
    
        //5. 关闭文件
        file4.Close()
        
        //6. 删除文件或者文件夹
        // err := os.Remove("/Users/isuntong/Documents/test/a/ab.txt")
        // err := os.Remove("/Users/isuntong/Documents/test/a/") //删除目录,如果不为空不能删除
        // err := os.RemoveAll("/Users/isuntong/Documents/test/a/") //删除目录,谨慎使用
        
    }
    

    io读操作

    package main
    
    import (
        "fmt"
        "io"
        "os"
    )
    
    //5
    func main() {
        /*
        读取数据:
            Reader借口:
                Read(p [[byte)(n int,error)
    
    
        读取本地abc.txt文件中的数据、
    
        */
        //1。 打开文件
        fileName := "/Users/isuntong/Documents/test/a/abc.txt"
        file,err := os.Open(fileName)
        if err != nil {
            fmt.Println("err:",err)
            return
        }
    
        //3。 关闭文件
        defer file.Close()
    
        //2。 读取数据 abcdefghij
        bs := make([]byte,4,4)
    
    /*
        //第一次读取
        n,err := file.Read(bs)
        fmt.Println(err) //<nil>
        fmt.Println(n) //4
        fmt.Println(bs) //[97 98 99 100]
        fmt.Println(string(bs)) //abcd
    
        //第二次读取
        n,err = file.Read(bs)
        fmt.Println(err) //<nil>
        fmt.Println(n) //4
        fmt.Println(bs) //[101 102 103 104]
        fmt.Println(string(bs)) //efgh
    
        //第三次读取
        n,err = file.Read(bs)
        fmt.Println(err) //<nil>
        fmt.Println(n) //2
        fmt.Println(bs) //[105 106 103 104]
        fmt.Println(string(bs)) //ijgh
    
        //第四次读取
        n,err = file.Read(bs)
        fmt.Println(err) //EOF
        fmt.Println(n) //0
        fmt.Println(bs) //[105 106 103 104]
        fmt.Println(string(bs)) //ijgh
    */
    
    /*
       abcd
       efgh
       ij
       读取到文件末尾,结束读取操作
    */
        n := -1
        for {
            n,err = file.Read(bs)
            if n==0 || err == io.EOF{
                fmt.Println("读取到文件末尾,结束读取操作")
                break
            }
            fmt.Println(string(bs[:n]))
        }
    
    
    }
    
    

    io写操作

    package main
    
    import (
        "fmt"
        "log"
        "os"
    )
    
    //6
    func main() {
        /*
        写出数据:
    
        读取本地abc.txt文件中的数据、
    
        */
        fileName := "/Users/isuntong/Documents/test/a/ab.txt"
    
        //1. 打开文件
        //file,err := os.Open(fileName) 没有权限,只有只读,写的时候报错  bad file descriptor
        //O_APPEND 这样就是追加,不是覆盖
        file,err := os.OpenFile(fileName,os.O_CREATE|os.O_WRONLY|os.O_APPEND,os.ModePerm)
        if err != nil {
            fmt.Println("err",err)
            return
        }
    
        //3. 关闭文件
        defer file.Close()
    
        //2. 写出数据 每次从头开始写,即覆盖之前的n个
        bs := []byte{65,66,67,68,69,70} //ABCDEF
        //n,err := file.Write(bs)
        n,err := file.Write(bs[:2])
        fmt.Println(n) //2
        HandleErr(err)
    
        //直接写出字符串
        n,err = file.WriteString("helloworld")
        fmt.Println(n) //10
        HandleErr(err)
    
        //换行
        file.WriteString("\n")
        n,err = file.Write([]byte("today"))
    
    
    }
    
    func HandleErr(err error) {
        if err != nil {
            log.Fatal(err)
        }
    }
    
    

    复制文件

    package main
    
    import (
       "fmt"
       "io"
       "io/ioutil"
       "os"
    )
    
    //7
    func main() {
       /*
       拷贝文件:
    
       读取本地abc.txt文件中的数据、拷贝图片什么的也可以
    
       */
       srcFile := "/Users/isuntong/Documents/test/a/ab.txt"
       destFile := "ab.txt"
    
       total,err := CopyFile1(srcFile,destFile) //拷贝完毕
       fmt.Println(total,err) //38 <nil>
    
    
    }
    
    //利用ioutil
    func CopyFile3(srcFile,destFile string) (int,error) {
       bs,err := ioutil.ReadFile(srcFile)
       if err != nil {
           return 0,err
       }
    
       err = ioutil.WriteFile(destFile,bs,0777)
       if err != nil {
           return 0,err
       }
       return len(bs),nil
    
    }
    
    //使用io.Copy()方法 这种方法比较好
    func CopyFile2(srcFile,destFile string) (int64,error) {
       file1,err := os.Open(srcFile)
       if err != nil {
           return 0,err
       }
    
       file2,err := os.OpenFile(destFile,os.O_WRONLY|os.O_CREATE,os.ModePerm)
       if err != nil {
           return 0,err
       }
    
       defer file1.Close()
       defer file2.Close()
    
       return io.Copy(file2,file1)
    
    }
    
    
    //用于通过io操作实现文件的拷贝,返回值是拷贝的总数量(字节),错误
    func CopyFile1(srcFile,destFile string) (int,error) {
       file1,err := os.Open(srcFile)
       if err != nil {
           return 0,err
       }
    
       file2,err := os.OpenFile(destFile,os.O_WRONLY|os.O_CREATE,os.ModePerm)
       if err != nil {
           return 0,err
       }
    
    
       defer file1.Close()
       defer file2.Close()
       //读写
       bs := make([]byte,1024,1024)
       n := -1
       total := 0
       for {
           n,err = file1.Read(bs)
           if err == io.EOF || n == 0 {
               fmt.Println("拷贝完毕")
               break
           } else if err != nil {
               fmt.Println("出错了。。。")
               return total,err
           }
           total += n
           file2.Write(bs[:n])
       }
       return total,nil
    }
    
    

    断点续传

    bufio包

    func NewReader(rd io.Reader) *Reader

    func NewReaderSize(rd io.Reader,size int) *Reader

    ioutil包

    相关文章

      网友评论

          本文标题:文件 io

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