文件 io

文件操作

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包

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容