Go语言学习笔记(五)文件操作
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959
文件读取
os.File 封装了文件相关操作
type File
File代表一个打开的文件对象。 func Create(name string) (file *File, err error)
Create采用模式0666(任何人都可读写,不可执行)创建一个名为name的文件,如果文件已存在会截断它(为空文件)。如果成功,返回的文件对象可用于I/O;对应的文件描述符具有O_RDWR模式。如果出错,错误底层类型是*PathError。 func Open(name string) (file *File, err error)
Open打开一个文件用于读取。如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有O_RDONLY模式。如果出错,错误底层类型是*PathError。 func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
OpenFile是一个更一般性的文件打开函数,大多数调用者都应用Open或Create代替本函数。它会使用指定的选项(如O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/O。如果出错,错误底层类型是*PathError。 func NewFile(fd uintptr, name string) *File
NewFile使用给出的Unix文件描述符和名称创建一个文件。 func Pipe() (r *File, w *File, err error)
Pipe返回一对关联的文件对象。从r的读取将返回写入w的数据。本函数会返回两个文件对象和可能的错误。 func (f *File) Name() string
Name方法返回(提供给Open/Create等方法的)文件名称。 func (f *File) Stat() (fi FileInfo, err error)
Stat返回描述文件f的FileInfo类型值。如果出错,错误底层类型是*PathError。 func (f *File) Fd() uintptr
Fd返回与文件f对应的整数类型的Unix文件描述符。 func (f *File) Chdir() error
Chdir将当前工作目录修改为f,f必须是一个目录。如果出错,错误底层类型是*PathError。 func (f *File) Chmod(mode FileMode) error
Chmod修改文件的模式。如果出错,错误底层类型是*PathError。 func (f *File) Chown(uid, gid int) error
Chown修改文件的用户ID和组ID。如果出错,错误底层类型是*PathError。 func (f *File) Readdir(n int) (fi []FileInfo, err error)
Readdir读取目录f的内容,返回一个有n个成员的[]FileInfo,这些FileInfo是被Lstat返回的,采用目录顺序。对本函数的下一次调用会返回上一次调用剩余未读取的内容的信息。
如果n>,Readdir函数会返回一个最多n个成员的切片。这时,如果Readdir返回一个空切片,它会返回一个非nil的错误说明原因。如果到达了目录f的结尾,返回值err会是io.EOF。
如果n<=,Readdir函数返回目录中剩余所有文件对象的FileInfo构成的切片。此时,如果Readdir调用成功(读取所有内容直到结尾),它会返回该切片和nil的错误值。如果在到达结尾前遇到错误,会返回之前成功读取的FileInfo构成的切片和该错误。 func (f *File) Readdirnames(n int) (names []string, err error)
Readdir读取目录f的内容,返回一个有n个成员的[]string,切片成员为目录中文件对象的名字,采用目录顺序。对本函数的下一次调用会返回上一次调用剩余未读取的内容的信息。
如果n>,Readdir函数会返回一个最多n个成员的切片。这时,如果Readdir返回一个空切片,它会返回一个非nil的错误说明原因。如果到达了目录f的结尾,返回值err会是io.EOF。
如果n<=,Readdir函数返回目录中剩余所有文件对象的名字构成的切片。此时,如果Readdir调用成功(读取所有内容直到结尾),它会返回该切片和nil的错误值。如果在到达结尾前遇到错误,会返回之前成功读取的名字构成的切片和该错误。 func (f *File) Truncate(size int64) error
Truncate改变文件的大小,它不会改变I/O的当前位置。 如果截断文件,多出的部分就会被丢弃。如果出错,错误底层类型是*PathError。 func (f *File) Read(b []byte) (n int, err error)
Read方法从f中读取最多len(b)字节数据并写入b。它返回读取的字节数和可能遇到的任何错误。文件终止标志是读取0个字节且返回值err为io.EOF。 func (f *File) ReadAt(b []byte, off int64) (n int, err error)
ReadAt从指定的位置(相对于文件开始位置)读取len(b)字节数据并写入b。它返回读取的字节数和可能遇到的任何错误。当n<len(b)时,本方法总是会返回错误;如果是因为到达文件结尾,返回值err会是io.EOF。 func (f *File) Write(b []byte) (n int, err error)
Write向文件中写入len(b)字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法会返回一个非nil的错误。 func (f *File) WriteString(s string) (ret int, err error)
WriteString类似Write,但接受一个字符串参数。 func (f *File) WriteAt(b []byte, off int64) (n int, err error)
WriteAt在指定的位置(相对于文件开始位置)写入len(b)字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法会返回一个非nil的错误。 func (f *File) Seek(offset int64, whence int) (ret int64, err error)
Seek设置下一次读/写的位置。offset为相对偏移量,而whence决定相对位置:0为相对文件开头,1为相对当前位置,2为相对文件结尾。它返回新的偏移量(相对开头)和可能的错误。 func (f *File) Sync() (err error)
Sync递交文件的当前内容进行稳定的存储。一般来说,这表示将文件系统的最近写入的数据在内存中的拷贝刷新到硬盘中稳定保存。 func (f *File) Close() error
Close关闭文件f,使文件不能用于读写。它返回可能出现的错误。
os.File Pkg Doc
读写参数
文件打开模式:
const (
O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
O_RDWR int = syscall.O_RDWR // 读写模式打开文件
O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
O_CREATE int = syscall.O_CREAT // 如果不存在将创建一个新文件
O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,文件必须不存在
O_SYNC int = syscall.O_SYNC // 打开文件用于同步I/O
O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件
)
权限控制:
r ——>
w ——>
x ——>
读取栗子
os.Open || os.OpenFile
package main import (
"bufio"
"fmt"
"os"
) func main() {
// file, err := os.Open("/tmp/test")
file, err := os.OpenFile("/tmp/test", os.O_CREATE|os.O_WRONLY, )
if err != nil {
fmt.Println("Open file error: ", err)
return
}
defer file.Close() //关闭文件 reader := bufio.NewReader(file) //带缓冲区的读写
for {
str, err := reader.ReadString('\n') // 循环读取一行
if err != nil {
fmt.Println("read string failed, err: ", err)
return
}
fmt.Println("read string is %s: ", str)
}
}
readline
package main import (
"bufio"
"fmt"
"io"
"os"
) func main() {
file, err := os.Open("C:/test.log")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
reader := bufio.NewReader(file)
var line []byte
for {
data, prefix, err := reader.ReadLine()
if err == io.EOF {
break
} line = append(line, data...)
if !prefix {
fmt.Printf("data:%s\n", string(line))
line = line[:]
} }
}
读取整个文件栗子
"io/ioutil" 包实现了读取整个文件功能
package main import (
"fmt"
"os"
"io/ioutil"
) func main() {
fileName := "/tmp/test" file, err := os.OpenFile(fileName, os.O_CREATE|os.O_RDWR, )
if err != nil {
fmt.Println("Open file error: ", err)
return
}
defer file.Close() buf, err := ioutil.ReadAll(file)
//buf, err := ioutil.ReadFile(fileName)
if err != nil {
fmt.Fprintf(os.Stderr, "File Error: %s\n", err)
return
}
fmt.Printf("%s\n", string(buf))
}
读取压缩文件栗子
"compress/*" 包实现压缩文件功能。
"compress/gzip" 包实现了gzip格式压缩文件的读写
package main import (
"bufio"
"compress/gzip"
"fmt"
"os"
) func main() {
fileName := "/tmp/test.log.gz" var r *bufio.Reader fi, err := os.Open(fileName)
if err != nil {
fmt.Println("error", err)
os.Exit()
} fz, err := gzip.NewReader(fi)
if err != nil {
fmt.Println("error", err)
return
} r = bufio.NewReader(fz)
for {
line, err := r.ReadString('\n')
if err != nil {
fmt.Println("Done reading file")
return
}
fmt.Println(line)
}
}
文件写入
file.WriteString || file.Write
package main import (
"fmt"
"os"
) func main() {
fileName := "/tmp/test_write" file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, )
if err != nil {
fmt.Println("error", err)
os.Exit()
}
defer file.Close() fileString := "Today very happy."
file.Seek(, ) // 最后增加
file.WriteString(fileString)
//file.Write([]byte(fileString))
}
bufio.Writer.WriteString
带缓冲的写,最后要将缓冲中的数据写入下层的io.Writer接口(Flush方法)
package main import (
"bufio"
"fmt"
"os"
) func main() {
fileName := "/tmp/test_write" file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, )
if err != nil {
fmt.Println("error", err)
os.Exit()
}
defer file.Close() fileWrite := bufio.NewWriter(file)
fileString := "good.\n"
for i := ; i < ; i++ {
fileWrite.WriteString(fileString)
}
fileWrite.Flush()
}
拷贝文件栗子
从一个文件拷贝到另一个文件
package main import (
"fmt"
"io"
"os"
) func CopyFile(dstName, srcName string) (writeen int64, err error) {
src, err := os.Open(dstName)
if err != nil {
fmt.Println(err)
return
}
defer src.Close() dst, err := os.OpenFile(srcName, os.O_CREATE|os.O_WRONLY, )
if err != nil {
fmt.Println(err)
return
}
defer dst.Close() return io.Copy(dst, src)
} func main() {
CopyFile("/tmp/test", "/tmp/test_copy1")
fmt.Println("copy done.")
}
栗子
判断文件或文件夹是否存在
func PathExists(path string) (bool, error) {
/*
判断文件或文件夹是否存在
如果返回的错误为nil,说明文件或文件夹存在
如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或文件夹不存在
如果返回的错误为其它类型,则不确定是否在存在
*/
_, err := os.Stat(path)
if err == nil {
return true, nil
}
if os.IsNotExist(err) {
return false, nil
}
return false, err
}
Go语言学习笔记(五)文件操作的更多相关文章
- python学习笔记(五)-文件操作2
一.文件修改 现有文件file.txt,内容如下:二十四节气歌春雨惊春清谷天,夏满芒夏暑相连.秋处露秋寒霜降,冬雪雪冬小大寒.上半年逢六廿一,下半年逢八廿三.每月两节日期定,最多相差一二天.要求:将文 ...
- Go语言学习笔记五: 条件语句
Go语言学习笔记五: 条件语句 if语句 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } 竟然没有括号,和python很像.但是有大括号,与python又不一样. 例子: pa ...
- python的学习笔记01_5文件操作
一,文件操作基本流程. 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众 ...
- node 学习笔记 - fs 文件操作
本文同步自我的个人博客:http://www.52cik.com/2015/12/03/learn-node-fs.html 最近看到群里不少大神都开始玩 node 了,我感觉跟他们步伐越来越大了, ...
- node学习笔记3——文件操作fs
文件操作关键字: http('fs') —— 请求 node 里面的 http 模块 readFile —— 读文件,参数包括 文件名,回调函数 writeFile —— 写文件,参数包括 文件 ...
- python学习笔记(三):文件操作和集合
对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句柄操作文件 3.关闭文件. 文件基本操作: f = open('file.txt','r') #以只读方式打开一个 ...
- python学习笔记:文件操作和集合
一.文件操作 文件读写步骤:有一个文件,打开文件,操作文件读写文件,关闭文件. python 文件读写模式r,r+,w,w+,a,a+的区别(附代码示例) 模式 可做操作 若文件不存在 是否覆盖 r ...
- Java 学习笔记(14)—— 文件操作
java文件操作主要封装在Java.io.File中,而文件读写一般采用的是流的方式,Java流封装在 java.io 包中.Java中流可以理解为一个有序的字符序列,从一端导向到另一端.建立了一个流 ...
- python学习笔记之文件操作(三)
这篇博客小波主要介绍一下python对文件的操作 对文件的操作主要分为三步: 1.打开文件获取文件的句柄,句柄也是文件描述符 2.通过文件句柄操作文件 3.关闭文件. 现有以下文件,是小波随写的周杰伦 ...
- python学习笔记4(文件操作)
文件操作: 1.f=open(”caidan”,”w”,encoding=”utf8”) 直接打开一个文件,如果文件不存在则创建文件 f.close() 2.with open (”caid ...
随机推荐
- if 一元二次方程求根
if 语句 - 只有当指定条件为 true 时,使用该语句来执行代码 if...else 语句 - 当条件为 true 时执行代码,当条件为 false 时执行其他代码 if...else if... ...
- easygen通用代码生成框架[开源]
什么东东 用过mybatis的同学都知道,手工写mapper和xml是一件很痛苦的事儿,幸好官方提供了Mybatis-Generator,但是这家伙生成的东西不开放不方便修改,而且项目中的代码生成需求 ...
- PHP获取远程文件的几种方式
1.fopen() 2.file_get_contents() 3.fsocket() 4.curl()
- R语言统计分析技术研究——卡方检验的思想和实现
卡方检验的思想和实现 作者:李雪丽 材料摘自:百度
- 最全Oracle环境搭建之.NET程序员初遇Oracle
前言:如果你习惯了傻瓜式的一步步安装,那么Oracle和.NET搭配,绝对会让你头痛不已. 目前我不敢保证自己理解的Oracle理论部分100%正确,但环境安装过程一定可以收藏以备不时之需. 路这么长 ...
- RecycleView和CardView
一.RecycleView <android.support.v7.widget.RecyclerView android:id="@+id/my_recycler_view" ...
- git视频教程
git 精简版视频教程-2小时快速入门精华版,小教程很快就可以看完. 旺旺 QQ:Git是目前世界上最先进的分布式版本控制系统(没有之一). Git有非常高的逼格,简单来说就是:高端大气上档次. 这么 ...
- java怎么连接mysql数据库
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...
- JVM总结之GC
哪些内存需要回收 在Java堆中存放着几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要知道哪些对象还"存活着",哪些对象已经"死去". 引用计数 ...
- 二、Solr单机版的搭建
1.1. 运行环境 solr 需要运行在一个Servlet容器中,Solr4.10.3要求jdk使用1.7以上,Solr默认提供Jetty(java写的Servlet容器),本次使用Tocmat作为S ...