1.io.EOF错误
io.EOF 是在没有任何可读取的内容时触发,比如某文件Reader对象,文件本身为空,或者读取若干次后,文件指针指向了末尾,调用Read都会触发EOF
2.perm参数权限
3.os.O_RDONLY等常量
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 // 如果可能,打开时清空文件
)
4.os.File结构体
type File struct {
*file // os specific
}
//注意:file仍然是os包里的,但是由于小写所以用不到
type file struct {
pfd poll.FD
name string
dirinfo *dirInfo // nil unless directory being read
appendMode bool // whether file is opened for appending
}
5.os.File{}.Close()方法
对文件进行操作后,一定要关闭文件,Close关闭文件f,使文件不能用于读写。它返回可能出现的错误
func (f *File) Close() error {
if f == nil {
return ErrInvalid
}
return f.file.close()
}
6.os.File{}.Write()方法
写入byte类型的信息到文件;
Write向文件中写入len(b)字节数据;
它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法会返回一个非nil的错误
func (f *File) Write(b []byte) (n int, err error) {}
7.os.File{}.WriteString()方法
写入string信息到文件,WriteString类似Write,但接受一个字符串参数
func (f *File) WriteString(s string) (n int, err error) {}
8.os.File{}.WriteAt()方法
WriteAt在指定的位置(相对于文件开始位置)写入len(b)字节数据;
它返回写入的字节数和可能遇到的任何错误;
如果返回值n!=len(b),本方法会返回一个非nil的错误。
func (f *File) WriteAt(b []byte, off int64) (n int, err error){}
9.os.File{}.Read()方法
Read方法从f中读取最多len(b)字节数据并写入b;
它返回读取的字节数和可能遇到的任何错误;
文件终止标志是读取0个字节且返回值err为io.EOF
func (f *File) Read(b []byte) (n int, err error) {}
10.os.File{}.ReadAt()方法
ReadAt从指定的位置(相对于文件开始位置)读取len(b)字节数据并写入b;
它返回读取的字节数和可能遇到的任何错误;
当n<len(b)时,本方法总是会返回错误;
如果是因为到达文件结尾,返回值err会是io.EOF。
func (f *File) ReadAt(b []byte, off int64) (n int, err error) {}
11.os.Open函数只读文件
Open函数用打开一个文件知识为了读取不需要写的场景下;
Open打开一个文件用于读取。如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有O_RDONLY模式。如果出错,错误底层类型是*PathError
11.1只打开文件
package main
import (
"fmt"
"os"
)
func main() {
/*func Open(name string) (*File, error) {
return OpenFile(name, O_RDONLY, 0)
}*/
// 只读方式打开当前目录下的main.go文件
file, err := os.Open("./main.go")
if err != nil {
fmt.Println("open file failed!, err:", err)
return
}
// 关闭文件
file.Close()
//注意:运行完该代码后,系统不会有任何输出
}
11.2打开并进行读取文件
package main
import (
"fmt"
"io"
"os"
)
func main() {
// 打开文件
file, err := os.Open("./xxx.txt")
if err != nil {
fmt.Println("open file err :", err)
return
}
defer file.Close()
// 定义接收文件读取的字节数组
var buf [128]byte
var content []byte
for {
//注意:每次进行写的时候都会清除切片里原本的内容进行重新写
//Read方法从file中读取最多len(b)字节数据并写入buf;
n, err := file.Read(buf[:]) //[:]表示原有的切片,即把[128]byte数组转换成长度为128的切片
if err == io.EOF {
// 读取结束
break
}
if err != nil {
fmt.Println("read file err ", err)
return
}
content = append(content, buf[:n]...)
}
fmt.Println(string(content))
}
12.os.OpenFile函数
打开名称为name的文件,flag是打开的方式,只读、读写等,perm是权限
func OpenFile(name string, flag int, perm FileMode) (*File, error) {}
13.os.Create函数创建文件
13.1无文件的情况下创建并进行写
根据提供的文件名创建新的文件,返回一个文件对象,默认权限是0666
package main
import (
"fmt"
"os"
)
func main() {
/*func Create(name string) (*File, error) {
return OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666)
}
*/
// 不用自己手动创建,系统会自己建的
file, err := os.Create("./xxx.txt")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
for i := 0; i < 5; i++ {
file.WriteString("ab\n")
file.Write([]byte("cd\n"))
}
}
13.2有文件的情况下创建并进行写:
package main
import (
"fmt"
"os"
)
func main() {
// 我们提前建了一个xxx.txt文件,并在里面写了内容;运行代码后系统会把文件里的内容清楚掉,再进行写
file, err := os.Create("./xxx.txt")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
for i := 0; i < 5; i++ {
file.WriteString("ab\n")
file.Write([]byte("cd\n"))
}
}
13.3拷贝文件
package main
import (
"fmt"
"io"
"os"
)
func main() {
// 打开源文件
srcFile, err := os.Open("./xxx.txt")
if err != nil {
fmt.Println(err)
return
}
// 创建新文件
dstFile, err2 := os.Create("./abc2.txt")
if err2 != nil {
fmt.Println(err2)
return
}
// 缓冲读取
buf := make([]byte, 1024)
for {
// 从源文件读数据
n, err := srcFile.Read(buf)
if err == io.EOF {
fmt.Println("读取完毕")
break
}
if err != nil {
fmt.Println(err)
break
}
//写出去
dstFile.Write(buf[:n])
}
srcFile.Close()
dstFile.Close()
}
14.os.Hostname函数获取主机名
func Hostname() (name string, err error) {
return hostname()
}
15.os.Getwd函数获取当前目录
func Getwd() (dir string, err error) {}
16. os.Getpid函数获取当前进程ID
func Getpid() int { return syscall.Getpid() }
17. os.Getppid函数获取当前进程ID
func Getppid() int { return syscall.Getppid() }
18.os.Exit函数退出当前进程
func Exit(code int) {}
19.os.Mkdir函数创建目录,不能创建多级
func Mkdir(name string, perm FileMode) error {}
20.os.MkdirAll函数创建多级目录
func MkdirAll(path string, perm FileMode) error {}
21.os.Remove函数只能删除一个空的目录或一个文件
func Remove(name string) error {}
22.os.RemoveAll函数可以强制删除目录以及目录汇中的文件
func RemoveAll(path string) error {
return removeAll(path)
}
23.os.Rename函数重命名文件
func Rename(oldpath, newpath string) error {
return rename(oldpath, newpath)
}
24.os.Chmod函数修改文件权限
func Chmod(name string, mode FileMode) error { return chmod(name, mode) }
25.os.Chown函数修改文件所有者
func Chown(name string, uid, gid int) error {
26.os.Getenv函数获取环境变量的值
func Getenv(key string) string {}
27.os.Setenv函数设置环境变量
func Setenv(key, value string) error {}