- 开发无止境 -
Data: 2016-07-12 08:15:24Form: JournalClick: 12
权限perm,在创建文件时才需要指定,不需要创建新文件时可以将其设定为0。虽然go语言给perm权限设定了很多的常量,但是习惯上也可以直接使用数字,如0666(具体含义和Unix系统的一致)。
权限项 | 文件类型 | 读 | 写 | 执行 | 读 | 写 | 执行 | 读 | 写 | 执行 |
---|---|---|---|---|---|---|---|---|---|---|
字符表示 | (d;l;c;s;p) | r | w | x | r | w | x | r | w | x |
数字表示 | 4 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | 1 | |
权限分配 | 文件所有者 | 文件所有者 | 文件所有者 | 文件所属组用户 | 文件所属组用户 | 文件所属组用户 | 其他用户 | 其他用户 | 其他用户 |
关于- rwx rwx rwx
:
-
:代表这是一个普通文件,其中其他文件类型还包括了:
d--------------------->目录文件(directory)
l---------------------->链接恩建(link)
b--------------------->设备文件(block)
c---------------------->字符设备文件(character)
s---------------------->套接字文件(socket)
p---------------------->管道文件(pipe)
func Create(name string) (file *File,err error)
Create采用模式0666(任何人都可读写,不可执行)创建一个名为name的文件,如果文件已存在会截断它(为空文件)。如果成功,返回的文件对象可用于I/O;对应的文件描述符具有O_RDWR模式。如果出错,错误底层类型是*PathError。
实例演示:
// 创建文件
func createFile() {
f, err := os.Create("test.txt")
if err != nil {
fmt.Printf("err: %v\n", err)
} else {
fmt.Printf("f: %v\n", f)
}
}
func Mkdir(name string,perm FileMode) error{}
只能创建单个目录,不能创建多级目录
实例演示:
func createDir1() {
err := os.Mkdir("test", os.ModePerm)
if err != nil {
fmt.Printf("err: %v\n", err)
}
}
func MkdirAll(path string ,perm FileMode) error{}
实例演示:
func createDir2() {
err := os.MkdirAll("test/a/b", os.ModePerm)
if err != nil {
fmt.Printf("err: %v\n", err)
}
}
func Remove(name string) error{}
实例演示:
func removeDir1() {
err := os.Remove("test.txt")
if err != nil {
fmt.Printf("err: %v\n", err)
}
}
func RemoveAll(path string) error{
retuen removeAll(path)
}
实例演示:
func removeDir2() {
err := os.RemoveAll("test")
if err != nil {
fmt.Printf("err: %v\n", err)
}
}
func Getwd() (dir string,err error){}
实例演示:
func getWd() {
dir, err := os.Getwd()
if err != nil {
fmt.Printf("err: %v\n", err)
} else {
fmt.Printf("dir: %v\n", dir)
}
}
func (f *File) Chdir() error
改变工作目录到f,其中f必须为一个目录,否则便会报错
实例演示:
func chWd() {
err := os.Chdir("d:/")
if err != nil {
fmt.Printf("err: %v\n", err)
}
fmt.Println(os.Getwd())
}
func TempDir() string{
return tempDir
}
实例演示:
func getTemp() {
s := os.TempDir()
fmt.Printf("s: %v\n", s)
}
func Rename(olapath , newpath string)error{
return rename(oldpath,newpath)
}
实例演示:
func renameFile() {
err := os.Rename("test.txt", "test2.txt")
if err != nil {
fmt.Printf("err: %v\n", err)
}
}
func Chmod(name string,mode FileMode) error {
return chmod(name,mode)
}
func Chown(name string ,uid,gid int) error {}
const (
O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
O_RDWR int = syscall.O_RDWR // 读写模式打开文件
O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
O_CREATE int = syscall.O_CREAT // 如果不存在将创建一个新文件
O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,文件必须不存在
O_SYNC int = syscall.O_SYNC // 打开文件用于同步I/O
O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件
)
func Create(name string) (file *File, err error) // 创建一个空文件,注意当文件已经存在时,会直接覆盖掉原文件,不会报错
func Open(name string) (file *File, err error) // 打开一个文件,注意打开的文件只能读,不能写
func OpenFile(name string, flag int, perm FileMode) (file *File, err error) // 以指定的权限打开文件
func (f *File) Close() error // 关闭文件,关闭后不可读写
其实
os.Create等价于:
OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666)
实例演示:
package main
import (
"fmt"
"os"
)
func openCloseFile() {
// 只能读
f, _ := os.Open("a.txt")
fmt.Printf("f.Name(): %v\n", f.Name())
// 根据第二个文件打开模式参数 可以指定权限为读写或者创建
f2, _ := os.OpenFile("a1.txt", os.O_RDWR|os.O_CREATE, 0755)
fmt.Printf("f2.Name(): %v\n", f2.Name())
err := f.Close()
fmt.Printf("err: %v\n", err)
err2 := f2.Close()
fmt.Printf("err2: %v\n", err2)
}
func main() {
openCloseFile()
}
func (f *File) Stat() (fi FileInfo,err error) //获取文件的信息,里面有文件的名称,大小,修改时间等
func (f *File) Read(b []byte) (n int,err error) //从文件中一次性读取b大小的数据,当读到文件结尾时,返回EOF错误
func (f *File) ReadAt(b []byte,off int64) (n int, err error)//从文件中指定的位置(off)一次性读取b大小的数据
func ReadDir(name string) ([]DirEntry,error) //读取目录并返回排序好的文件以及子目录名切片
func (f *File) Seek(offset int64,whence int) (ret int64,err error)
//Seek设置下次读/写的位置。offset为相对偏移量,而whence决定相对位置:0为相对文件开头,1为相对当前位置,2为相对文件结尾。它返回新的偏移量(相对开头)和可能的错误。
package main
import (
"fmt"
"io"
"os"
)
func main() {
f, _ := os.Open("a.txt")
for {
buf := make([]byte, 4) // 设置一个缓冲区,一次读4个字节
n, err := f.Read(buf) // 将读到的内容放入缓冲区内
fmt.Printf("string(buf): %v\n", string(buf))
fmt.Printf("n: %v\n", n)
if err == io.EOF { // EOF表示文件读取完毕
break
}
}
f.Close()
}
package main
import (
"fmt"
"os"
)
func main() {
buf := make([]byte, 10)
f2, _ := os.Open("a.txt")
// 从5开始读10个字节
n, _ := f2.ReadAt(buf, 5)
fmt.Printf("n: %v\n", n)
fmt.Printf("string(buf): %v\n", string(buf))
f2.Close()
}
package main
import (
"fmt"
"os"
)
func main() {
// 测试 a目录下有b和c目录
f, _ := os.Open("a")
de, _ := f.ReadDir(-1) // 返回一个切片de
for _, v := range de {
fmt.Printf("v.IsDir(): %v\n", v.IsDir())
fmt.Printf("v.Name(): %v\n", v.Name())
}
}
package main
import (
"fmt"
"os"
)
func main() {
f, _ := os.Open("a.txt") // 打开文件后,光标默认在文件开头
f.Seek(3, 0) // 从索引值为3处开始读
buf := make([]byte, 10) // 设置缓冲区
n, _ := f.Read(buf) // 将内容读到缓冲区内
fmt.Printf("n: %v\n", n)
fmt.Printf("string(buf): %v\n", string(buf))
f.Close()
}
package main
import (
"fmt"
"os"
)
func main() {
f, _ := os.Open("a.txt") // 打开文件后,光标默认在文件开头
fInfo, _ := f.Stat()
fmt.Printf("f是否是一个文件: %v\n", fInfo.IsDir())
fmt.Printf("f文件的修改时间: %v\n", fInfo.ModTime().String())
fmt.Printf("f文件的名称: %v\n", fInfo.Name())
fmt.Printf("f文件的大小: %v\n", fInfo.Size())
fmt.Printf("f文件的权限: %v\n", fInfo.Mode().String())
}
func (f *File) Write(b []byte) (n int, err error)
//Write向文件中写入len(b)字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法会返回一个非nil的错误。
func (f *File) WriteString(s string) (ret int,err error)
//WriteString类似Write,但接受一个字符串参数
func (f *File) WriteAt(b []byte,off int64) (n int , err error)
// WriteAt在指定的位置(相对于文件开始位置)写入len(b)字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法返回一个非nil的错误。
package main
import (
"os"
)
func main() {
f, _ := os.OpenFile("a.txt", os.O_RDWR|os.O_APPEND, 0775) // 以读写模式打开文件,并且在写操作时将数据附加到文件尾部
f.Write([]byte(" hello golang"))
f.Close()
}
package main
import (
"os"
)
func main() {
f, _ := os.OpenFile("a.txt", os.O_RDWR, 0775) // 以读写模式打开文件
f.WriteAt([]byte("aaa"), 3) // 从索引值为3的地方开始写入aaa并覆盖原来当前位置的数据
f.Close()
}
func Exit(code int) // 让当前程序以给出的状态码(code)退出。一般来说,状态码0表示成功,非0表示出错。程序会立刻终止,defer的函数不会被执行。
func Getuid() int // 获取调用者的用户id
func Geteuid() int // 获取调用者的有效用户id
func Getgid() int // 获取调用者的组id
func Getegid() int // 获取调用者的有效组id
func Getgroups() ([]int, error) // 获取调用者所在的所有组的组id
func Getpid() int // 获取调用者所在进程的进程id
func Getppid() int // 获取调用者所在进程的父进程的进程id
unc Hostname() (name string, err error) // 获取主机名
func Getenv(key string) string // 获取某个环境变量
func Setenv(key, value string) error // 设置一个环境变量,失败返回错误,经测试当前设置的环境变量只在 当前进程有效(当前进程衍生的所以的go程都可以拿到,子go程与父go程的环境变量可以互相获取);进程退出消失
func Clearenv() // 删除当前程序已有的所有环境变量。不会影响当前电脑系统的环境变量,这些环境变量都是对当前go程序而言的