文件 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包

相关文章

  • Linux 文件IO 和 标准IO

    [TOC] Linux 文件IO 和 标准IO Linux 文件IO Linux中做文件IO最常用到的5个函数是:...

  • 文件IO

    1.open/close 函数原型:int open(const char *pathname,int flags...

  • 文件IO

    读文件 要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符: 标示符'r...

  • 文件IO

  • 文件IO

    2016-01-29 文件IO 大多数文件io只需要用到5个函数 open read write lseek cl...

  • 文件IO

    python文件打开方法 open(name,[,mode[buf]]) 文件读取 read([size]) si...

  • 文件IO

    open函数函数原型:#includeint open (const char *pathnam...

  • 文件io

    展开由于该知识点涉及到I/O操作,因此,在这里简单的对I/O操作做简单的说明。 冯诺依曼体系结构中,将计算机分为运...

  • 文件 io

    文件操作 io读操作 io写操作 复制文件 断点续传 bufio包 func NewReader(rd io.Re...

  • python文件处理、路径处理、序列化和反序列化

    文件IO常用操作 一般说IO操作,指的是文件IO,如果指的是网络IO,会直接说。 把文件存储到磁盘上的这个过程,叫...

网友评论

      本文标题:文件 io

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