GO文件操作

文件操作案例

import (
    "bufio"
    "fmt"
    "io"
    "os"
)

//写入方式一
func main01() {
    //路径分为绝对路径和相对路径
    //create,文件存在则会覆盖原始内容(其实就相当于清空),不存在则创建
    fp, error := os.Create("./a.txt")
    if error != nil {
        fmt.Println("文件创建失败!")
        return
    }
    //延迟调用,关闭文件
    defer fp.Close()
    //写入文件,windows上面换行\r\n其他\n即可
    fp.WriteString("hello\r\n")
    n, _ := fp.WriteString("world\r\n")
    fmt.Println(n) //7 其实就是写入的内容长度world\r\n刚好7
}

//写入方式二
func main2() {
    fp, error := os.Create("./a.txt")
    if error != nil {
        fmt.Println("文件创建失败!")
        return
    }
    defer fp.Close()
    b := []byte{'h', 'e', 'l', 'l'}
    fp.Write(b)
    str := "world"
    //字符串和切片允许相互转换
    b1 := []byte(str)
    fp.Write(b1)
}

//写入方式三:指定位置
func main3() {
    //os.Open是只读打开

    /**
    读写方式:
    O_APPEND:追加
    O_RDONLY: 只读
    O_RDWR:可读可写
    O_WRONLY:只写
    */

    //第三个参数是权限,取值范围0-7
    /**
    0:没有任何权限
    1:执行权限(如果是可执行文件,是可以运行的)
    2:写权限
    3:写权限与执行权限
    4:读权限
    5:读权限与执行权限
    6:读权限与写权限
    7:读权限,写权限,执行权限
    */
    //OpenFile无法创建文件
    fp, error := os.OpenFile("./a.txt", os.O_RDWR, 6)
    if error != nil {
        fmt.Println("文件创建失败!")
        return
    }
    defer fp.Close()
    //b:=[]byte("hello")
    //执行前内容aaaaa
    //执行后内容ahello
    //fp.WriteAt(b,1)

    //获取文件字符个数,参数一可以是负数,这样可以往左偏移
    n, _ := fp.Seek(0, io.SeekEnd)
    b := []byte("hello")
    //此时就相当于追加了,因为n此时是内容总长度了
    fp.WriteAt(b, n) //ahellohello

}

//读取文件
func main4() {
    fp, error := os.Open("./a.txt")
    if error != nil {
        /**
        系统打开文件个数限制是65535
        所以重复打开同一文件是可以的

        1. 文件不存在
        2. 文件权限
        3. 文件打开上限
        */
        fmt.Println("文件打开失败!")
        return
    }
    defer fp.Close()

    b := make([]byte, 1024)
    //n, error := fp.Read(b)
    //fmt.Println(n) //n是长度
    fp.Read(b)

    //也可以通过for遍历读取
    fmt.Println(string(b)) //ahellohello
}

func main5() {
    fp, error := os.Open("./a.txt")
    if error != nil {
        fmt.Println("文件打开失败!")
        return
    }
    defer fp.Close()
    b := make([]byte, 20)
    for {
        n, err := fp.Read(b)
        //文件结束
        if err == io.EOF { //-1
            break
        }
        fmt.Print(string(b[:n]))
    }
}

func main() {
    fp, error := os.Open("./a.txt")
    if error != nil {
        fmt.Println("文件打开失败!")
        return
    }
    defer fp.Close()
    //行读取。新建缓冲区,把内容先放到缓冲区
    r := bufio.NewReader(fp)
    for {
        buf, err := r.ReadBytes('\n')
        fmt.Print(string(buf))

        //文件结束,此时必须读取在上面,否则最后一行的时候err == io.EOF,则永远会少读取一行
        if err == io.EOF { //-1
            break
        }
    }
}

拷贝文件

func main() {

    // 打开读文件
    f_r, err := os.Open("C:/z1/测试.avi")
    if err != nil {
        fmt.Println("Open err: ", err)
        return
    }
    defer f_r.Close()
    // 创建写文件
    f_w, err := os.Create("C:/z1/test.avi")
    if err != nil {
        fmt.Println("Create err: ", err)
        return
    }
    defer f_w.Close()

    // 从读文件中获取数据,放到缓冲区中。
    buf := make([]byte, 4096)
    // 循环从读文件中,获取数据,“原封不动的”写到写文件中。
    for {
        n, err := f_r.Read(buf)
        if err != nil && err == io.EOF {
            fmt.Printf("读完。n = %d\n", n)
            return
        }
        f_w.Write(buf[:n]) // 读多少,写多少
    }
}

目录操作

打开目录

OpenFile:以只读方式打开目录

  • 参1:name, 打开目录的路径: 绝对路径、相对路径
  • 参2:打开目录权限: O_RDONLY
  • 参3:os.ModeDir,
    返回值: 返回一个可以读目录的 文件指针。

读目录:Readdir

原型:func (f *File) Readdir(n int) ([]FileInfo, error) {
            
参数: 欲打开的目录项个数。 -1 , 表所有;例如10,则只读取十个目录项

返回值:  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 main()  {
    // 获取用户输入的目录路径
    fmt.Println("请输入待查询的目录:")
    var path string
    fmt.Scan(&path)

    // 打开目录
    f, err := os.OpenFile(path, os.O_WRONLY, os.ModeDir)
    if err != nil {
        fmt.Println("OpenFile err: ", err)
        return
    }
    defer f.Close()
    // 读取目录项
    info, err:= f.Readdir(-1)   // -1: 读取目录中所有目录项
    if err != nil {
        fmt.Println("Readdir err: ", err)
        return
    }
    // 变量返回的切片
    for _, fileInfo := range info {
        if fileInfo.IsDir() {           // 是目录
            fmt.Println(fileInfo.Name(), " 是一个目录")
        } else {
            fmt.Println(fileInfo.Name(), " 是一个文件")
        }
    }
}

MMU

虚拟内存映射单元


MMU.png

缓冲区

缓冲区.png

文件读写分为,系统缓存和用户缓冲,用户缓存就是写代码时候创建的缓存,而用户缓存则是系统内部的缓存调度,不是每次读写都是操作磁头扇区等硬件,而是系统尽可能的预读入缓输出,减少硬件交互,代码的读取和写入都是读取和写入系统缓冲区,真正什么时候写入硬盘,有系统内部IO优化算法操作。

结构体指针传参

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

推荐阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,256评论 0 9
  • 如果使用http操作文件可以参考:http对文件的一般处理 File 建立File内存地址 打开文件 写文件 读文...
    吃猫的鱼0阅读 349评论 0 1
  • http://www.cnblogs.com/sevenyuan/archive/2013/02/28/29372...
    一个简单搬运工阅读 641评论 0 2
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,093评论 1 32
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,833评论 0 5