在上一篇文章中,我们介绍了常用的文件读写操作,今天接着来研究一下,除了读写以外的其他常见文件操作。

一、创建目录:

package main

import (
"fmt"
"os"
) func main() {
// 创建单个目录
os.Mkdir("go", os.ModePerm) // 创建多级目录
os.MkdirAll("go/lang", os.ModePerm) // 返回FileInfo实例
info, _ := os.Stat("go/lang") printFileInfo(info)
} // 显示文件信息
func printFileInfo(info os.FileInfo) {
fmt.Printf("name: %v \n", info.Name()) // 文件名
fmt.Printf("size: %v \n", info.Size()) // 文件大小
fmt.Printf("mode: %v \n", info.Mode()) // 文件权限
fmt.Printf("is dir: %v \n", info.IsDir()) // 是否为目录类型
fmt.Printf("modify time: %v \n", info.ModTime()) // 最后修改时间
}

os.Mkdir() 方法只能创建单个目录,而 os.MkdirAll() 可以创建多级目录。

最后我们使用 os.State() 方法获取目录或文件的描述对象,通过这个对象,我们可以得到目录或文件的各种常用信息。

二、检测目录或文件是否存在:

package main

import (
"fmt"
"os"
) func main() {
path := "go/lang/test.txt" // 返回FileInfo实例
info, err := os.Stat(path) // 检测文件或目录是否存在
if (os.IsNotExist(err)) {
// 创建文件
os.Create(path) // 重新获取FileInfo
info, _ = os.Stat(path)
} printFileInfo(info)
} // 显示文件信息
func printFileInfo(info os.FileInfo) {
fmt.Printf("name: %v \n", info.Name())
fmt.Printf("size: %v \n", info.Size())
fmt.Printf("mode: %v \n", info.Mode())
fmt.Printf("is dir: %v \n", info.IsDir())
fmt.Printf("modify time: %v \n", info.ModTime())
}

如果 err 的值为 nil,则表示文件存在,可完成后续的操作。

如果要判断文件不存在,则要通过 os.isNotExist(err) 方法来检测。

三、列举目录下的所有文件:

package main

import (
"fmt"
"io/ioutil"
"path"
) func main() {
dirPath := "go/lang" // 利用ioutil读取目录
files, _ := ioutil.ReadDir(dirPath) // 遍历目录
for _, fileInfo := range files {
fileName := fileInfo.Name() // 拼接路径
filePath := path.Join(dirPath, fileName) fmt.Println(filePath)
}
}

ioutil.ReadDir() 方法的完整签名是:func ReadDir(dirname string) ([]os.FileInfo, error),它返回一个 os.FileInfo 类型的切片,我们可以遍历这个结果,逐个处理目录下的每一个文件。

如果遍历的过程中遇到子目录,我们可以通过 fileInfo.IsDir() 来检测,如果检测结果是目录,则再进行递归调用即可。

值得一提的是,path/filepath 包提供了遍历多级目录的方法,下面我们演示一下:

package main

import (
"fmt"
"path/filepath"
"os"
) func main() {
dirPath := "go" filepath.Walk(dirPath, func(path string, fileInfo os.FileInfo, err error) error {
if fileInfo == nil {
return err
} isDir := fileInfo.IsDir() fmt.Println(path, "is dir?", isDir) return nil
})
}

四、重命名文件:

package main

import (
"os"
) func main() {
// 对文件重命名
os.Rename("go/lang/test.txt", "go/lang/test2.txt")
}

五、移除目录或文件:

package main

import (
"os"
) func main() {
// 移除文件或空目录
os.Remove("go/lang/test2.txt")
// 移除文件或目录
os.RemoveAll("go")
}

os.Remove() 方法可以移除单个文件或空目录,如果想移除非空目录,则需要调用 os.RemoveAll() 方法来完成。

关于文件的操作方式还有很多,今天就先介绍到这里吧,后续有时间再补充。

Golang: 读写之外的其他文件操作的更多相关文章

  1. golang中的文件操作

    一.文件的基本介绍 文件是数据源(保存数据的地方)的一种,比如经常使用的word文档,txt文件,excel文件都是文件.文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保持视频,声音等等. ...

  2. golang读写文件

    1. 标准输入输出 os提供了标准输入输出文件: Stdin = NewFile(uintptr(syscall.Stdin), "/dev/stdin") Stdout = Ne ...

  3. Golang文件操作整理

    基本操作 文件创建 创建文件的时候,一定要注意权限问题,一般默认的文件权限是 0666 关于权限的相关内容,具体可以参考鸟叔p141 这里还是再回顾下,文件属性 r w x r w x r w x,第 ...

  4. C语言的fopen函数(文件操作/读写)

    头文件:#include <stdio.h> fopen()是一个常用的函数,用来以指定的方式打开文件,其原型为:    FILE * fopen(const char * path, c ...

  5. Delphi的文件操作(定义,关联,打开,读写,关闭)

    参考自:http://www.cnblogs.com/railgunman/articles/1800318.html Delphi 中默认有input 和 output 两个文件变量,使用可以不用定 ...

  6. golang文件操作

    一.读写文件 1.读文件操作 os.File 封装所有文件相关操作 例子: package main import ( "fmt" "os" "io/ ...

  7. python之文件的读写和文件目录以及文件夹的操作实现代码

    这篇文章主要介绍了python之文件的读写和文件目录以及文件夹的操作实现代码,需要的朋友可以参考下 为了安全起见,最好还是给打开的文件对象指定一个名字,这样在完成操作之后可以迅速关闭文件,防止一些无用 ...

  8. pytthon—day8 读写模式的结合、文件操作模式、with完成文本文件复制、游标操作

    一.读写模式的结合 w:写指没有新建文件,有文件就清空 w=open('1.txt','w',encoding='utf-8') w.write('000\n') 在写入数据时,需要及时处理内存空间, ...

  9. Python之IO编程——文件读写、StringIO/BytesIO、操作文件和目录、序列化

    IO编程 IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口.从 ...

随机推荐

  1. 洛谷 CF399B【Red and Blue Balls】题解

    n年没有更博客:我总结出了规律,当学的东西很难得时候都去学习,没有时间写博客,只有 内容对于我这种蒟蒻友好,又让我非常闲的慌时才写博客,这种博客以后也没有价值(也有些是做完一道题有成就感写的) 最近内 ...

  2. centos6中安装新版 Elasticsearch 7.x

    es出新版了,虽然公司里还是用的老版本,但是本地还是有必要自己安装了玩玩 下载地址:https://www.elastic.co/cn/downloads/elasticsearch 那么一般来说还是 ...

  3. ES6基础-ES6的扩展

    进行对字符串扩展,正则扩展,数值扩展,函数扩展,对象扩展,数组扩展. 开发环境准备: 编辑器(VS Code, Atom,Sublime)或者IDE(Webstorm) 浏览器最新的Chrome 字符 ...

  4. ##xcode 文件模板自定义

    xcode 文件模板自定义 在使用xcode内部模板创建C++类文件时,创建出来的头文件是.hpp结尾的,但是我想用.h结尾的, 所以就网上找了下资料看能不能自定义模板,这样还可以修改文档注释.在网上 ...

  5. Spring Cloud Greenwich.SR4 发布了,跟不上了……

    前几天 Spring Cloud Greenwich.SR4 发布了: https://spring.io/blog/2019/11/19/spring-cloud-greenwich-sr4-rel ...

  6. Linux 系统开机时间及当前时间

    最近一次系统开机时间:date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H:%M ...

  7. java dump 内存分析 elasticsearch Bulk异常引发的Elasticsearch内存泄漏

    Bulk异常引发的Elasticsearch内存泄漏 2018年8月24日更新: 今天放出的6.4版修复了这个问题. 前天公司度假部门一个线上ElasticSearch集群发出报警,有Data Nod ...

  8. golang 赋值与声明语法糖使用注意事项

    赋值与声明语法糖 基本用法略, 搜索即可 注意事项 类型推断 := 会自动进行类型推断, 当想要的类型不是自己想要的类型时需要进行类型转换 // i1 默认是 int 类型 i1 := 1 // 当需 ...

  9. SpringBoot系列教程web篇Servlet 注册的四种姿势

    原文: 191122-SpringBoot系列教程web篇Servlet 注册的四种姿势 前面介绍了 java web 三要素中 filter 的使用指南与常见的易错事项,接下来我们来看一下 Serv ...

  10. 线程互斥synchronized

    /** * * 线程互斥,采用synchronized关键字可以实现线程与线程之间的互斥,要注意的是在synchronized上的对象要是同一个,才可以 * 保证在同一时刻,只有一个线程可以执行syn ...