Go os,bufio,ioutil包 对文件读取写入小结 和文件/文件夹是否存在

网友投稿 1046 2022-11-30

Go os,bufio,ioutil包 对文件读取写入小结 和文件/文件夹是否存在

Go os,bufio,ioutil包 对文件读取写入小结 和文件/文件夹是否存在

对单个文件读取写入  带缓冲区  bufio包

打开一个存在的文件,并且将原来的内容覆盖为新的内容。这里不需要创建文件所以不需要使用

os.O_CREATE。

os.O_TRUNC | os.O_WRONLY 以写的方式打开已经存在的文件,在写之前清空文件里面的内容。

fileSd,err := os.OpenFile("test.txt",os.O_TRUNC | os.O_WRONLY,os.ModePerm) if err != nil{ fmt.Println("open file error:",err) return } //及时关闭file文件句柄 defer fileSd.Close() //写入的时候,使用带缓存的 *Writer writer := bufio.NewWriter(fileSd) for i := 0; i < 5; i++{ writer.WriteString("hh\r\n") //表示换行,为了在记事本和其他编辑器都可以看到换行效果 } writer.Flush()

如果要在原来文件内容的后面追加,并不是将原来的文件覆盖掉,比如在写日志的时候是追加写。

下面是追加的形式,就不是覆盖写了。

fileSd,err := os.OpenFile("test.txt",os.O_APPEND | os.O_WRONLY,os.ModePerm)

再接下来就是打开一个文件,将原来的内容读出来显示在终端,并且追加。这就需要文件是以读写的方式打开,并且以追加的方式打开。

这里面关键就是告诉其以读写到方式打开,写到时候以追加到方式往里面写。

fileSd,err := os.OpenFile("test.txt",os.O_APPEND | os.O_RDWR,0666) reader := bufio.NewReader(fileSd) fmt.Println(reader) for { content,err := reader.ReadString('\n') if err == io.EOF{ //如果读取到文件到末尾就不读了 break } fmt.Println(content,err) }

不带缓冲区,一次性读写

编写一个程序,将一个文件内容,写入到另外一个文件,这两个文件都是存在的。

使用ioutil.ReadFile /ioutil.WriteFile 完成写文件的任务。

filePath := "test.txt" //将文件的内容读取到内存, content,err := ioutil.ReadFile(filePath) if err != nil { //说明读取文件出错了,将错误信息输出,然后退出 fmt.Println("read fiile error:",err) return //文件读取失败就结束了,不能往下走了 } fmt.Println(string(content)) //将读取到到内容写入到文件里面 err = ioutil.WriteFile("test1.txt",content,os.ModePerm) if err != nil{ fmt.Println("write file error:",err) }

思路其实也和下面这个步骤一样,打开一个文件,然后创建一个文件,从打开的文件当中使用死循环不断向目标文件里面写入数据。

srcf = open(src)dstf= create(dst)read srcf=>ctxwriter dstf ctx=>srcf.close dstf.close()

io包里面有copy函数,这个copy函数其实就是从src里面读取内容,然后写到dst里面去。下面就是不断从文件当中读取内容,往标准输出上面去写。

file,_ := os.Open("test.txt") defer file.Close() io.Copy(os.Stdout,file)

判断是文件还是目录

操作目录,对目录的读取。

path := "test" fileSd,err := os.Open(path) fmt.Println(fileSd,err) if err != nil{ return } defer fileSd.Close() contents := make([]byte,10) n,err := fileSd.Read(contents) fmt.Println(n,err)

如果是一个目录,就不能读取里面的内容。所以这里还得判断是文件还是目录。

0 read test: is a directory

func (*File) ​​Stat​​

func (f *​​File​​​) Stat() (​​FileInfo​​​,​​error​​)

下面就是将文件的名称,判断是否为目录这些等都打印出来。

fileInfo,err := fileSd.Stat() if err != nil{ fmt.Println(err) } fmt.Println(fileInfo.Name(),fileInfo.IsDir(),fileInfo.Mode(),fileInfo.ModTime().Format("2006-01-02 15:04:05"),fileInfo.Size())test true drwxr-xr-x 2022-03-22 18:57:19 64

获取目录下面所有文件的信息

func (*File) ​​Readdirnames​​

func (f *​​File​​​) Readdirnames(n​​int​​​) (names []​​string​​​, err​​error​​)

-1代表将当前文件夹下面的文件名称全部读取出来,不会递归读取。

func (*File) ​​Readdir​​

func (f *​​File​​​) Readdir(n​​int​​​) ([]​​FileInfo​​​,​​error​​)

fileInfo,err := fileSd.Readdir(-1) for _,v := range fileInfo{ fmt.Println(v.Name()) }

判断文件是否存在

在进行文件操作的时候,有时候会有这样一个功能,判断文件是否存在,这个在项目里面会经常使用。

判断文件是否存在

golang判断文件或文件夹是否存在的方法为使用os.Stat()函数返回的错误值进行判断

如果返回的错误为nil,说明文件或文件夹存在如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或文件夹不存在如果返回的错误为其它类型,则不确定是否在存在

func ​​Stat​​

func Stat(name ​​string​​​) (​​FileInfo​​​, ​​error​​)

这个可以自己定义一个函数,输入路径来判断目录或者文件是否存在。(传入文件路径,根据布尔值来判断文件是否存在,true为文件/文件夹存在,反之)

func PathExits(path string) (bool,error) { _,err := os.Stat(path) if err == nil{ //文件或者目录存在 return true,nil } if os.IsNotExist(err) { //判断错误类型是不是不存在类型错误 return false,nil } return false,err //有错误,但是不是上面的错误类型,那么就将错误原封不动的返回}

总结

文件

创建:os.Create  如果文件存在会去清空文件读取:os.0pen获取属性:os.0pen().Stat/os.Stat修改属性:权限,所属人重命名:os.Rename("test1.txt","test2.txt")  //不仅仅可以重命名,还可以将文件移动到某些目录下面 os.Rename("test/file1","a/b/c/file2")删除文件:os.Remove("test1.txt")

没有复制的功能!

目录

创建:os.Mkdir("a",os.ModePerm)  os.MkdirAll("a/b/c",os.ModePerm)读取:os.0pen获取属性:os.0pen().Stat/ os.Stat修改属性:权限,所属人os.Chmod() os.Chown()重命名:os.Rename删除文件夹:os.Remove  os.RemoveAll

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Go 文件创建并使用带缓冲区写文件
下一篇:Grafana 仪表盘
相关文章

 发表评论

暂时没有评论,来抢沙发吧~