os 包提供了对文件、系统和进程的操作函数
一、文件操作
1.1 常用常量
StdinStdoutStderr-
1.2 常用函数
Chmod:修改文件权限Chown:修改文件所属用户,用户组Chtimes:修改文件访问时间和修改时间IsExist:与os.Stat一起用于判断文件存在IsNotExist:与os.Stat一起用于判断文件不存在Link:创建软链接Mkdir:创建文件夹MkdirAll:创建文件夹(父目录不存在逐层创建)Remove:移除文件或空文件夹RemoveAll:移除所有文件-
1.3 常用结构体
-
1.3.1 常用函数
Create:创建文件并返回文件对象指针(文件不存在则创建,文件存在则清空)Open:打开文件并返回文件对象指针-
1.3.2 常用方法
Read:读取文件到字节切片Write:写入字节切片到文件WriteString:写入字符串到文件Readdir:获取目录下所有文件信息Readdirnames:获取目录下所有文件名Seek:设置文件指针位置Stat:获取文件状态信息Sync:同步文件到硬盘-
二、方法使用
2.1 读取一个文件(不带缓冲的IO读取)
func main() {path := "text.txt"f, err := os.Open(path)if err != nil {fmt.Println(err)return}content := make([]byte, 1024)for {n, err := f.Read(content)if err != nil {if err != io.EOF {fmt.Println(err)}break}fmt.Println(string(content[:n]))}f.Close()}
2.2 创建文件
os.Create写文件,文件存在截断(清空),文件不存在创建os.open读取文件,文件不存在报错func main() {path := "text.txt"f, err := os.Create(path)if err != nil {fmt.Println(err)return}defer f.Close()f.Write([]byte("123456\n"))f.Write([]byte("休息休息\n"))f.WriteString("我是大冬")}
2.3 标准输入输出
标准输入 => 命令行的文件
os.Stdin
标准输出 => 命令行的文件os.Stdout
标准错误输出 => 命令行的文件os.Stderrfunc main() {content := make([]byte, 3)fmt.Print("请输入内容:")os.Stdin.Read(content)fmt.Println(string(content))fmt.Printf("%q\n", string(content))os.Stdout.WriteString("我是Stdout输出")//fmt.Scan//fmt.Sscan => 从字符串扫描到变量//fmt.Fscan => 从文件扫描到变量}
2.3.1 openfile
func OpenFile(name string, flag int, perm FileMode) (*File, error) name代表文件的路径flag代表打开的方式O_RDONLY以只读方式打开O_WRONLY以只写方式打开O_RDWR以读写方式打开O_APPEND追加O_CREATE文件不存在时创建O_EXCL文件必须不存在O_SYNC使用同步IOO_TRUNC截断文件
perm文件的权限# 日志文件存在追加方式func main() {f, err := os.OpenFile("test.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0777)if err != nil {return}defer f.Close()fmt.Fprintf(f,"%s\n",time.Now().Format("2006-01-02 15:04:05"))}
2.4 创建带有缓冲的buf
2.4.1 带有缓冲的读取
f, err := os.Open("text.txt")if err != nil {fmt.Println(err)return}defer f.Close()reader := bufio.NewReader(f)// 每行进行读取fmt.Println(reader.ReadLine())
2.4.2 带有缓冲的写入
```go func main() { f, err := os.Create(“text.txt”) if err != nil {
} defer f.Close() writer := bufio.NewWriter(f) writer.WriteString(“hello 大冬\n”) writer.Flush() }return
<a name="DXgzd"></a># 三、文件的操作- 文件- 创建 => `os.Create`- 读取 => `os.Open`- 获取属性 => `os.Open().Stat` / `os.Stat`- 修改属性 => 权限,所属人- `os.Chmod()` 修改权限- `os.Chown()` 修改所属人- 重命名- `os.Rename()`- 删除文件- `os.Remove()`- 目录- 创建- `os.Mkdir("a",os.ModePerm)`- `os.MkdirAll("a/b/c",os.ModePerm)`- 读取- `os.Open`- 获取属性- `os.Open().Stat`- `os.Stat`- 修改属性- `os.Chmod()` 修改权限- `os.Chown()` 修改所属人- 重命名文件夹(移动)- `os.Rename()`- 删除文件夹- `os.Remove()`- `os.RemoveAll()`<a name="EZB0H"></a># 四、ioutil包<a name="QfW15"></a>## 4.1 读取`ioutil.ReadAll()` 读取所有open打开的内容<br />`ioutil.ReadFile()` 直接读取文件,不需要先open<br />`ioutil.ReadDir()` 读取目录所有文件<a name="VmNjW"></a>## 4.2 写入`ioutil.WriteFile()` 直接写入文件 => `ioutil.WriteFile("text.txt", []byte("123456"), os.ModePerm)`<a name="VRetW"></a># 五、Path<a name="Wr05H"></a>## 5.1 filepath获取:- `filepath.Abs()` 获取文件的绝对路径- `filepath.Base()` 获取文件的名称- `filepath.Dir()` 获取文件的父目录- `filepath.Ext()` 获取文件后缀- `filepath.Glob("dir/*/*.go")` 获取dir目录里面所有子目录里的`*.go`文件- `filepath.Walk` 获取所有子目录文件(递归)分割和连接:- `filepath.Split()` 分割文件的父目录和文件名称- `filepath.SplitList("a;b;c")` 通过`;`分号进行分割- `filepath.Join("d:\\a","b/c/d")` 连接路径判断:- `filepath.HasPrefix("main.go","D:\\a")` 判断是否在路径下- `filepath.IsAbs()` 判断是否是绝对路径`filepath.Walk`示例:```gofilepath.Walk("testdir", func(path string, info fs.FileInfo, err error) error {fmt.Println(path,info.Name())return nil})
六、文件格式
6.1 gob文件编解码
编码一段gob文件
type User struct {Id intName string}func main() {users := []User{{1, "dadong"},{2, "dd"},{3, "xxd"},}gob.Register(User{})file, err := os.Create("dd.gob")if err != nil {return}defer file.Close()encoder := gob.NewEncoder(file)encoder.Encode(users)}
解码
type User struct {Id intName string}func main() {gob.Register(User{})file,err:=os.Open("dd.gob")if err != nil {return}defer file.Close()decoder := gob.NewDecoder(file)var users []Userfmt.Println(decoder.Decode(&users))fmt.Println(users)}
