package os_ioutil
import (
"fmt"
"io/ioutil"
"os"
"strings"
)
func main() {
//获取当前登录用户
//u, _ := user.Current()
//fmt.Println(u.Name)
//fmt.Println(u.Uid)
//fmt.Println(u.Gid)
//fmt.Println(u.Username)
//fmt.Println(u.HomeDir)
/*//创建文件夹
//os.Mkdir()中的路径必须是父目录必须存在,且如果文件夹存在则也报错
_ := os.Mkdir("D:/a/b", os.ModeDir)
//os.MkdirAll()功能很强大
_ := os.MkdirAll("D:/a/c", os.ModeDir)
*/
//创建文件
//如果文件已存在则创建新的覆盖原来的
//f, err := os.Create("D:/b/test.txt") //文件的上一级目录必须存在
//if err != nil {
// fmt.Println("文件创建失败")
//}
//fmt.Println(f.Name())
//重命名文件或删除文件夹
//err := os.Rename("D:/b/test.txt", "D:/b/a.txt")
//if err != nil {
// fmt.Println("重命名文件失败")
//}
//获取文件(文件夹)信息
//f, _ := os.Open("D:/b/a.txt")
//defer f.Close()
//fileinfo, _ := f.Stat()
//fmt.Println(fileinfo.Name()) //文件名称
//fmt.Println(fileinfo.IsDir()) //是否是文件夹
//fmt.Println(fileinfo.Mode()) //文件权限
//fmt.Println(fileinfo.ModTime()) //文件的修改时间
//fmt.Println(fileinfo.Size()) //文件的大小
//删除文件后删除文件夹
//_ = os.Remove("D:/b/c.txt")//一般不用,删除的必须是文件或空文件夹且必须存在
//_ = os.RemoveAll("D:/a")//只要文件夹存在就删除
//输入流和输出流,相对于程序来说的,下面是输入流
//第一种字符串的
r := strings.NewReader("hello World")
b := make([]byte, r.Size())
n, _ := r.Read(b)
fmt.Println("读取数据长度为", n)
fmt.Println("读取内容为", string(b))
//第二种文件形式的
f, _ := os.Open("D:/b/a.txt")
fileinfo, _ := f.Stat()
b = make([]byte, fileinfo.Size())
_, _ = f.Read(b)
fmt.Println(string(b))
//open()与openFile()的区别
//open()这是一个只读打开模式,实际上就是 os.OpenFile() 的快捷操作,它的原型如下:
//func Open(name string) (file *File, err error) {
// // return OpenFile(name, O_RDONLY, 0)
// //}
//func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
//这个复杂点,需要提供文件路径、打开模式、文件权限
//O_RDONLY:只读模式(read-only)
//O_WRONLY:只写模式(write-only)
//O_RDWR:读写模式(read-write)
//O_APPEND:追加模式(append)
//O_CREATE:文件不存在就创建(create a new file if none exists.)
//O_EXCL:与 O_CREATE 一起用,构成一个新建文件的功能,它要求文件必须不存在(used with O_CREATE, file must not exist)
//O_SYNC:同步方式打开,即不使用缓存,直接写入硬盘
//O_TRUNC:打开并清空文件
//文件权限(unix权限位):只有在创建文件时才需要,不需要创建文件可以设置为 0。os库虽然提供常量,但是我一般直接写数字,如0664
//下面是输出流,输出流就不能用open()了,因为open只是读取数据并不修改,若要修改则必须用openFile
//func (self *Log) WriteLogFile(log string) {
// logFile, err := os.OpenFile("../log/log_"+time.Now().Format("2006-01-02")+".txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
// if err != nil {
// fmt.Println("open log file failed!!!")
// return
// }
// logFile.WriteString(time.Now().Format("2006-01-02 15:04:05.000") + " " + log)
// logFile.Close()
//}
filePath := "D:/a.txt"
f, err := os.OpenFile(filePath, os.O_APPEND, 0777) //可以将将第二个参数加上os.O_CREAT
if err != nil {
f, _ = os.Create(filePath)
}
defer f.Close()
f.Write([]byte("ashdkasdkaskda")) //也可以直接用writestring()(封装了write方法)
//第三个参数表示文件权限,如:0666
//第一个0(0000)表示这个数是八进制
//第二个6(0110)表示文件所有者有读写权限,但没有执行权限
//第三个6(0110)表示文件拥有着同组用户有读写权限,但没有执行权限
//第三个6(0110)表示其他用户有读写权限,但没有执行权限
//7(0111)最高权限表示可读可写可执行
//4(0100) 可读不可写不能被执行
//ioutil包,含有以下函数ioutil.ReadAll()-->和os.open()结合(只有先打开才能读取),也可以用更简单的ioutil.Readfile(path)
//ioutil.WriteFile(path,[]byte(""sjhdajkshdkj),0664)//具有局限性,实际上是先清空再写进去
//ioutil。ReadDir(path) //读取文件夹的内容
fi, _ := ioutil.ReadDir(filepath)
for _, v := range fi {
fmt.Println(v.Name())
}
}