文档章节

Go笔记-文件

漂泊尘埃
 漂泊尘埃
发布于 2017/02/27 17:12
字数 992
阅读 17
收藏 1

创建和删除目录

	os.Mkdir("file", os.ModePerm)
	os.MkdirAll("file2/sub1/sub2", os.ModePerm)
	err := os.Remove("file2/sub1") // cann't remove
	if err != nil {
		fmt.Println(err)
	}
	os.RemoveAll("file2")
	os.Remove("file")

linux中文件权限的表示

可读-可写-可执行表示为111,没有权限使用0

分组:自己-同组用户-其他用户,每组3位数,如110 110 100即664,表示自己可读写,同组用户可读写,其他用户可读。

创建并写文件

	fout, err := os.Create("t1.txt")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer fout.Close()

	for i := 0; i < 10; i++ {
		fout.WriteString("just 测试 string.\r\n")
		fout.Write([]byte("just 测试 []byte.\r\n"))
	}

打开并读文件

	f, err := os.Open("t1.txt")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer f.Close()

	buf := make([]byte, 1024)
	for {
		n, _ := f.Read(buf)
		if n == 0 {
			break
		}
		os.Stdout.Write(buf[:n])
	}

也可以使用 ioutil.ReadAll(f),它会把整个文件都读到内存中。

按行读取文件

func FileRead(filePath string) (err error) {
	file, err := os.OpenFile(filePath, os.O_RDONLY, os.ModePerm)
	if err != nil {
		return
	}
	defer file.Close()

	reader := bufio.NewReader(file)
	var (
		line      string
		lineCount int
	)
	for err == nil {
		line, err = reader.ReadString('\n')
		line = strings.TrimSpace(line) // line包含换行符
		if line == "" {
			continue
		}
		lineCount++
		if lineCount > 10 {
			break
		}
		fmt.Println(lineCount, line)
	}
	if err == io.EOF {
		err = nil
	}
	return
}

使用bufio.NewScanner

	input := bufio.NewScanner(f)
    for input.Scan() {
        counts[input.Text()]++ // input.Text()不包含换行符
    }
// readFromFile will read all lines from the given filename and write them to a
// string array, if filename is empty readFromFile returns and empty string
// array
func readLinesFromFile(filename string) ([]string, error) {
	if filename == "" {
		return nil, nil
	}

	file, err := os.Open(filename)
	if err != nil {
		return nil, err
	}
	defer file.Close()

	var lines []string

	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		lines = append(lines, scanner.Text())
	}

	if err := scanner.Err(); err != nil {
		return nil, err
	}

	return lines, nil
}

删除文件

删除文件和删除目录是同一个方法

	err := os.Remove("t1.txt")
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println("removed.")
	}

删除目录时要求目录是空的。

覆盖式写文件(不存在时创建)

	file, err := os.OpenFile(fileName, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, os.ModePerm)
	if err != nil {
		return
	}
	defer file.Close()

	_, err = file.Write(data)

遍历目录

遍历所有后代文件或目录

	filepath.Walk("/a/b/c", func(path string, info os.FileInfo, err error) error {
		// do something...
		return nil
	})

path是文件的全路径

跳过目录

return filepath.SkipDir

遍历子文件或目录

file, _ := os.Open(path)
children, _ := file.Readdir(-1)

或者使用ioutil.ReadDir()

以树形显示目录树

func WalkSubDir() (t *tree.TreeNode) {
	root := "/a/b/c"
	t = tree.NewTreeNode(nil, root)

	walkDirToTree(t, root)
	return t
}

func walkDirToTree(t *tree.TreeNode, path string) {
	file, _ := os.Open(path)
	fileInfo, _ := file.Stat()
	node, _ := t.AppendChild(fileInfo.Name())

	// 文件
	if !fileInfo.IsDir() {
		return
	}

	// 目录
	children, _ := file.Readdir(-1)
	for _, child := range children {
		walkDirToTree(node, filepath.Join(path, child.Name()))
	}
}

使用正则搜索文件

	dir := "/a"
	files, err := filepath.Glob(dir + "/*.md")
	if err != nil {
		panic(err)
	}

	for _, d := range files {
		fmt.Printf("match %10s \n", d)
	}

输出示例:

match /a/a.md 

可用的正则:

pattern:
	{ term }
term:
	'*'         matches any sequence of non-Separator characters
	'?'         matches any single non-Separator character
	'[' [ '^' ] { character-range } ']'
	            character class (must be non-empty)
	c           matches character c (c != '*', '?', '\\', '[')
	'\\' c      matches character c

character-range:
	c           matches character c (c != '\\', '-', ']')
	'\\' c      matches character c
	lo '-' hi   matches character c for lo <= c <= hi

查看文档和test文件了解更多。

当前程序运行的目录

	workPath, _ = os.Getwd()
	workPath, _ = filepath.Abs(workPath)
	AppPath, _ = filepath.Abs(filepath.Dir(os.Args[0]))
  • 摘自beego
  • os.Args[0] 是运行文件的全路径
  • workPath 和 AppPath 应该是一样的,不一样的情况还不知道是怎么样的?

判断文件是否存在

func FileExists(name string) bool {
	if _, err := os.Stat(name); err != nil {
		if os.IsNotExist(err) {
			return false
		}
	}
	return true
}
  • 摘自beego
  • os.IsNotExist(err) 可判断err是不是表示不存在
  • 与之相反的是:os.IsExist(err)
  • 也可以判断目录是否存在

以列表显示目录树,可自定义根节点名称

func GetHugoContentDirList() (list []string) {
	root, err := os.Open("D:/work/hugo/mysite/content")
	if err != nil {
		return
	}
	list = append(list, "root")
	children := getChildren("root", root)
	list = append(list, children...)
	return
}

func getChildren(prefix string, parent *os.File) (children []string) {
	cFiles, err := parent.Readdir(-1)
	if err != nil {
		return
	}

	parentAbsPath, err := filepath.Abs(parent.Name())
	if err != nil {
		fmt.Println(err)
		return
	}

	for _, c := range cFiles {
		fullPath := prefix + "/" + c.Name()
		children = append(children, fullPath)
		if c.IsDir() {
			cFile, err := os.Open(filepath.Join(parentAbsPath, c.Name()))
			if err != nil {
				fmt.Println(err, c.Name())
				continue
			}
			subChildren := getChildren(fullPath, cFile)
			children = append(children, subChildren...)
		}
	}
	return
}

输出示例:

[root root/about.md root/post root/post/first.md root/post/second.md root/post/THREE.md]

复制文件

// copyFile creates dst from src, preserving file attributes and timestamps.
func copyFile(dst, src string) error {
	fi, err := os.Stat(src)
	if err != nil {
		return err
	}

	fsrc, err := os.Open(src)
	if err != nil {
		return err
	}

	if err = os.MkdirAll(filepath.Dir(dst), 0755); err != nil {
		fmt.Printf("MkdirAll(%v)\n", filepath.Dir(dst))
		return err
	}

	fdst, err := os.Create(dst)
	if err != nil {
		return err
	}

	if _, err = io.Copy(fdst, fsrc); err != nil {
		return err
	}

	if err == nil {
		err = fsrc.Close()
	}

	if err == nil {
		err = fdst.Close()
	}

	if err == nil {
		err = os.Chmod(dst, fi.Mode())
	}

	if err == nil {
		err = os.Chtimes(dst, fi.ModTime(), fi.ModTime())
	}

	return nil
}

© 著作权归作者所有

共有 人打赏支持
漂泊尘埃

漂泊尘埃

粉丝 5
博文 36
码字总数 71385
作品 0
朝阳
私信 提问
Kindle笔记导出工具--KindleNote

[TOC] KindleNote 简介 KindleNote 可以使你 KindleNote 阅读器中的笔记变得更易阅读。 我们通过对 KindleNote的笔记文件进行整理、分析,使得笔记片段合并为完整笔记。 你可以用 KindleNote...

杜小豆
2016/05/15
762
0
译文:笔记本软件 Quiver 简介

英文原文:http://happenapps.com 原文作者:HappenApps, Inc. 中译:不迟any Quiver 程序员的笔记本 Quiver app icon 概述 Quiver 是一款为程序员打造的笔记本。它可以让你方便的在一条笔记...

不迟any
2017/12/10
0
0
如何从为知笔记迁移到有道云笔记

今天是狠狠地体会到了各个云计算笔记之间的不兼容性。为知笔记很多插件很好用,但是都是支持有道云笔记和EverNote导入到为知笔记,没有从为知笔记导入到其他笔记的插件。今天一个很重要的笔记...

Ryan_snow
06/26
0
0
Joplin:开源加密笔记及待办事项应用

Joplin 是一个自由开源的笔记和待办事项应用,可用于 Linux、Windows、macOS、Android 和 iOS。它的主要功能包括端到端加密,Markdown 支持以及通过 NextCloud、Dropbox、OneDrive 或 WebDAV...

作者: Logix
11/11
0
0
用这样的 Vi 配置来保存和组织你的笔记

Vimwiki 和 GitLab 是记录笔记的强大组合。 用 vi 来管理 wiki 来记录你的笔记,这听起来不像是一个符合常规的主意,但当你的日常工作都会用到 vi , 那它是有意义的。 作为一个软件开发人员,...

12%
06/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

我是如何将博客转成PDF的

前言 只有光头才能变强 之前有读者问过我:“3y你的博客有没有电子版的呀?我想要份电子版的”。我说:“没有啊,我没有弄过电子版的,我这边有个文章导航页面,你可以去文章导航去找来看呀”...

Java3y
10分钟前
0
0
nginx的一些总结

Linux下安装Nginx完整教程及常见错误解决方案 1.Nginx安装环境 Nginx是C语言开发,建议在linux上运行,本教程使用Centos7.0作为安装环境. 1)gcc 安装nginx需要先将官网下载的源码进行编译,编译...

Yao--靠自己
17分钟前
0
0
Predicate函数式接口

Predicate接口主要用于流的筛选,比如在filter方法中传入Predicate判断。 作为函数式接口,这里居然有三个default方法,一个static方法,子孙满堂! 正统的接口方法,就是boolean test(T t)...

woshixin
17分钟前
0
0
sql 开窗函数

开窗函数:在开窗函数出现之前存在着很多用 SQL 语句很难解决的问题,很多都要通过复杂的相关子查询或者存储过程来完成。为了解决这些问题,在 2003 年 ISO SQL 标准加入了开窗函数,开窗函数...

hblt-j
28分钟前
1
0
使用Vue动态生成form表单的实例代码

具有数据收集、校验和提交功能的表单生成器,包含复选框、单选框、输入框、下拉选择框等元素以及,省市区三级联动,时间选择,日期选择,颜色选择,文件/图片上传功能,支持事件扩展。 欢迎大家s...

嫣然丫丫丫
35分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部