文章74
标签2
分类7

章节9_02_系统文件和目录

一. os包内容介绍

  • 使用os包中内容进行操作系统文件或目录
  • File结构体表示操作系统文件(夹)
// File represents an open file descriptor.
type File struct {
    *file // os specific
}
// file is the real representation of *File.
// The extra level of indirection ensures that no clients of os
// can overwrite this data, which could cause the finalizer
// to close the wrong file descriptor.
type file struct {
    pfd     poll.FD
    name    string
    dirinfo *dirInfo // nil unless directory being read
}
  • 操作系统的文件都是有权限控制的,包含可读,可写等,在os包中FileMode表示文件权限,本质是uint32,可取值都以常量形式提供
// A FileMode represents a file's mode and permission bits.
// The bits have the same definition on all systems, so that
// information about files can be moved from one system
// to another portably. Not all bits apply to all systems.
// The only required bit is ModeDir for directories.
type FileMode uint32
// The defined file mode bits are the most significant bits of the FileMode.
// The nine least-significant bits are the standard Unix rwxrwxrwx permissions.
// The values of these bits should be considered part of the public API and
// may be used in wire protocols or disk representations: they must not be
// changed, although new bits might be added.
const (
    // The single letters are the abbreviations
    // used by the String method's formatting.
    ModeDir        FileMode = 1 << (32 - 1 - iota) // d: is a directory
    ModeAppend                                     // a: append-only
    ModeExclusive                                  // l: exclusive use
    ModeTemporary                                  // T: temporary file; Plan 9 only
    ModeSymlink                                    // L: symbolic link
    ModeDevice                                     // D: device file
    ModeNamedPipe                                  // p: named pipe (FIFO)
    ModeSocket                                     // S: Unix domain socket
    ModeSetuid                                     // u: setuid
    ModeSetgid                                     // g: setgid
    ModeCharDevice                          // c: Unix character device, when ModeDevice is set
    ModeSticky                                     // t: sticky

    // Mask for the type bits. For regular files, none will be set.
    ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDevice

    ModePerm FileMode = 0777 // Unix permission bits
)
  • FIleInfo是一个interface表示文件的信息
// A FileInfo describes a file and is returned by Stat and Lstat.
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)
}

二. 资源路径

  • 在获取系统资源时资源路径分为相对路径和绝对路径
  • 相对路径:在Go语言中相对路径用于是GOPATH,也就是项目的根目录
  • 绝对路径:磁盘根目录开始表示资源详细路径的描述

三.代码示例

  • Go语言标准库中提供了两种创建文件夹的方式
    /*
    要求文件夹不存在且父目录必须存在,才能创建
     */
    //error := os.Mkdir("D:/godir", os.ModeDir)
    //if error != nil {
    //    fmt.Println("文件夹创建失败",error)
    //    return
    //}
    //fmt.Println("文件夹创建成功")


    /*
    如果文件夹已经存在,不报错,保留原文件夹
    如果父目录不存在帮助创建
     */
    error := os.MkdirAll("D:/godir/a/b", os.ModeDir)
    if error != nil {
        fmt.Println("文件夹创建失败",error)
        return
    }
    fmt.Println("文件夹创建成功")
  • 创建空文件
    /*
    创建文件时要求文件目录必须已经存在
    如果文件已经存在则会创建一个空文件覆盖之前的文件
     */
    file, err := os.Create("D:/godir/test.txt")
    if err != nil {
        fmt.Println("文件创建失败,", err)
        return
    }
    fmt.Println("文件创建成功",file.Name())
  • 重命名文件或文件夹
    /*
    第一个参数:原文件夹名称,要求此路径是必须存在的
    第二个参数:新文件夹名称
     */
    err := os.Rename("D:/godir", "D:/godir1")
    if err != nil {
        fmt.Println("重命名文件夹失败,", err)
        return
    }
    fmt.Println("文件夹重命名成功")

    /*
    重命名文件和重命名文件夹用法相同
     */
    err = os.Rename("D:/godir1/test.txt", "D:/godir1/test1.txt")
    if err != nil {
        fmt.Println("重命名文件失败,", err)
        return
    }
    fmt.Println("文件重命名成功")
  • 获取文件(夹)信息
    f, err := os.Open("D:/godir1/test1.txt")
    defer f.Close() //文件打开后要关闭,释放资源
    if err != nil {
        fmt.Println("打开文件失败", err)
        return
    }
    fileInfo, err := f.Stat()
    if err != nil {
        fmt.Println("获取文件信息失败", err)
        return
    }
    fmt.Println(fileInfo.Name())    //文件名
    fmt.Println(fileInfo.IsDir())   //是否是文件夹,返回bool,true表示文件夹,false表示文件
    fmt.Println(fileInfo.Mode())    //文件权限
    fmt.Println(fileInfo.ModTime()) //修改时间
    fmt.Println(fileInfo.Size())    //文件大小
  • 删除文件或文件夹
    /*
    删除的内容只能是一个文件或空文件夹且必须存在
     */
    //err := os.Remove("D:/godir1/a")
    //if err != nil {
    //    fmt.Println("文件删除失败", err)
    //    return
    //}
    //fmt.Println("删除成功")

    /*
    只要文件夹存在,删除文件夹.
    无论文件夹是否有内容都会删除
    如果删除目标是文件,则删除文件
     */
    err := os.RemoveAll("D:/godir1/a.txt")
    if err != nil {
        fmt.Println("删除失败", err)
        return
    }
    fmt.Println("删除成功")

0 评论