文档章节

Go笔记-文件

漂泊尘埃
 漂泊尘埃
发布于 2017/02/27 17:12
字数 992
阅读 16
收藏 1
点赞 0
评论 0

创建和删除目录

	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
博文 35
码字总数 70992
作品 0
朝阳
Kindle笔记导出工具--KindleNote

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

杜小豆 ⋅ 2016/05/15 ⋅ 0

有道云笔记最新软件下载官方版

有道笔记是网易有道全新推出的云笔记软件,旨在以云存储技术帮助用户建立一个可以轻松访问、安全存储的云笔记空间,解决个人资料和信息跨平台跨地点的管理问题。有道云笔记目前支持安卓手机版...

相心的泪 ⋅ 2016/09/03 ⋅ 0

译文:笔记本软件 Quiver 简介

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

不迟any ⋅ 2017/12/10 ⋅ 0

如何从为知笔记迁移到有道云笔记

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

王新睿 ⋅ 2015/02/05 ⋅ 0

笔记管理软件--KeepNote

KeepNote算是Linux下最方便好用的笔记软件之一。KeepNote可以存储你的课堂笔记,待办事项列表,研究笔记,日记,文件,可存储富文本格式,图像,也可以为文件添加附件等。当你在创建编辑笔记...

匿名 ⋅ 2010/06/21 ⋅ 2

开源的代办事项应用程序--joplin

joplin 是一个免费的,开源的笔记和待办事项的应用程序,可以处理笔记本组织成的大量笔记。笔记是可搜索的,可以直接从应用程序复制,标记和修改,也可以从自己的文本编辑器进行修改。笔记采...

匿名 ⋅ 2017/12/01 ⋅ 1

VNote: 一个舒适的Markdown笔记软件

Update: 支持macOSYunpan Update 2: 写在VNote半周岁 QQ群(487756074) Markdown标记语言一直是许多程序员的最爱。目前,有许多优秀的Markdown编辑器,也有许多优秀的笔记软件,但是能够支持M...

tamlok ⋅ 2017/02/12 ⋅ 0

Oracle笔记 目录索引

Oracle笔记 一、oracle的安装、sqlplus的使用 Oracle笔记 二、常用dba命令行 Oracle笔记 三、function 、selectOracle笔记 四、增删改、事务 Oracle笔记 五、创建表、约束、视图、索引、序列...

ibm_hoojo ⋅ 2011/05/03 ⋅ 0

Mini 容器学习笔记1——环境搭建(基础篇)

一. 环境下载 到Mini 容器的官方网站下载NLite框架的二进制文件,下载并解压后就可以了。 我们使用NLite框架需要用到下面的文件: NLite.dll(必要) 二. 建立NLite应用程序 新建一个控制台应用...

netcasewqs ⋅ 2011/08/26 ⋅ 0

如何在MyBatis-3.2.7中使用Log4j2 rc2——MyBatis学习笔记之十九

前天我上传了我的MyBatis系列课程(http://edu.51cto.com/course/course_id-1110.html)的第六讲,主要内容是如何使用Log4j2(具体版本为v2.0-rc1)为MyBatis 3.2.7配置日志。实际上目前最新...

NashMaster2011 ⋅ 2014/07/09 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

VS2015配置并运行汇编(一步一步照图做)【vs2017的链接在最后】

x64: TITLE Add and Subtract (AddSub.asm) ; This program adds and subtracts 32-bit integers. ; Last update: 2/1/02 ;.MODEL flat,stdcall x64 not su......

simpower ⋅ 昨天 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 昨天 ⋅ 0

Java桌球小游戏

其实算不上一个游戏,就是两张图片,不停的重画,改变ball图片的位置。一个左右直线碰撞的,一个有角度碰撞的。 左右直线碰撞 package com.bjsxt.test;import javax.swing.*;import j...

森林之下 ⋅ 昨天 ⋅ 0

你真的明白RPC 吗?一起来探究 RPC 的实质

你真的明白RPC 吗?一起来探究 RPC 的实质 不论你是科班出身还是半路转行,这么优秀的你一定上过小学语文,那么对扩句和缩句你一定不陌生。缩句就是去除各种修饰提炼出一句话的核心,而不失基...

AI9o後 ⋅ 昨天 ⋅ 0

z-index设置失效?

今天碰到了一个问题,就是在给li设置提示框的时候,有用到遮罩效果,本来想把对应的出现在最顶层,可是不管将li设置的z-index值设为多大,li都没有出现在遮罩层之上。 我在网上查了z-index设...

IrisHunag ⋅ 昨天 ⋅ 0

CyclicBarrier、CountDownLatch以及Semaphore使用及其原理分析

CyclicBarrier、CountDownLatch以及Semaphore是Java并发包中几个常用的并发组件,这几个组件特点是功能相识很容易混淆。首先我们分别介绍这几个组件的功能然后再通过实例分析和源码分析其中设...

申文波 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部