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

一、创建目录:

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. 洛谷p3353在你窗外闪耀的星星题解

    题目 首先被题目甜到了 本来搜标签搜的线段树,结果发现这题目很吸引我我果断点开 觉得前缀和就能A啊 于是乎 要注意 窗户旁边是可以看到的 所以前缀和的时候是不用再-1的 //前缀和 //注意坑点 // ...

  2. P2508 [HAOI2008]圆上的整点

    题目描述 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. 输入输出格式 输入格式: r 输出格式: 整点个数 输入输出样例 输入样例#1: 复制 4 输出样例#1: 复制 ...

  3. 【border相关】【P3426】 [POI2005]SZA-Template

    [border相关][P3426] [POI2005]SZA-Template Description 给定一个字符串 \(S\),要求一个最短的字符串 \(T\),使得 \(S\) 可以由 \(T\ ...

  4. fork()和vfork()的区别(转载)

    fork和vfork 转载 http://coolshell.cn/articles/12103.html 在知乎上,有个人问了这样的一个问题--为什么vfork的子进程里用return,整个程序会挂 ...

  5. Spring Boot 构造器参数绑定,越来越强大了!

    在之前的文章:Spring Boot读取配置的几种方式,我介绍到 Spring Boot 中基于 Java Bean 的参数绑定,在一个 Java Bean 类上用 @ConfigurationPro ...

  6. cad.net 定义lisp

    首先是传参型lisp的定义: (addLine (getpoint)) //定义lisp传入参数的例子 //复制到命令栏运行: (addLine (getpoint)) [LispFunction(& ...

  7. 爬取'Content-Type': 'text/plain;charset=UTF-8' ,发送请求数据方式

    解决方式 直接以字符串的方式发送data就可以得到响应数据 import requests data = 'k1:v1,k2:v2' requests.post(url, data=data)

  8. TPad需求和迭代

    需求和迭代最主要的区别是什么

  9. Background Suppression Network for Weakly-supervised Temporal Action Localization [Paper Reading]

    研究内容:弱监督时域动作定位 结果:Thumos14 mAP0.5 = 27.0 ActivityNet1.3 mAP0.5 = 34.5 从结果可以看出弱监督这种瞎猜的方式可以PK掉早些时候的一些全 ...

  10. 【C学习笔记】一

    一.运算符优先级 逻辑非>算术运算符>关系运算符>逻辑运算符>赋值运算符>逗号运算符 逻辑运算符>条件运算符>赋值运算符 对于if的执行语句,如果是一条语句那 ...