Go语言标准库中os包提供了不依赖平台的操作系统接口
设计为Unix风格的,而错误处理是go风格的,失败的调用会返回错误值而非错误码。通常错误值里包含更多信息
os包及子包功能
-- os 包 --os/exec 包,负责执行外部命令. --os/signal对输入信息的访问 --os/user 通过名称或ID 查询用户账户在os/user中提供了User结构体,表示操作系统用户
Uid 用户id
Gid 所属组id
Username 用户名
Name 所属组名
HomeDir 用户对应文件夹路径
// User represents a user account. type User struct { // Uid is the user ID. // On POSIX systems, this is a decimal number representing the uid. // On Windows, this is a security identifier (SID) in a string format. // On Plan 9, this is the contents of /dev/user. Uid string // Gid is the primary group ID. // On POSIX systems, this is a decimal number representing the gid. // On Windows, this is a SID in a string format. // On Plan 9, this is the contents of /dev/user. Gid string // Username is the login name. Username string // Name is the user's real or display name. // It might be blank. // On POSIX systems, this is the first (or only) entry in the GECOS field // list. // On Windows, this is the user's display name. // On Plan 9, this is the contents of /dev/user. Name string // HomeDir is the path to the user's home directory (if they have one). HomeDir string }在os/user中的Group表示用户所属组
Gid 组的id
Name 组的名称
// Group represents a grouping of users. // // On POSIX systems Gid contains a decimal number representing the group ID. type Group struct { Gid string // group ID Name string // group name }整个os/user包中内容比较少,提供了两个错误类型和获取当前用户,查找用户
type UnknownUserError func (e UnknownUserError) Error() string type UnknownUserIdError func (e UnknownUserIdError) Error() string type User func Current() (*User, error) func Lookup(username string) (*User, error) func LookupId(uid string) (*User, error)可以获取当前用户或查找用户后获取用户信息
//获取当前登录用户 //u,_:=user.Current() /* Lookup()参数是用户名,按照用户名查找指定用户对象 注意:必须使用完整名称不可以只写zhang */ u, _ := user.Lookup(`Ju1y-PC\Ju1y`) fmt.Println(u.Name) fmt.Println(u.Gid) fmt.Println(u.HomeDir) fmt.Println(u.Uid) fmt.Println(u.Username)
使用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("删除成功")