打开、创建文件
-
创建文件 Create
file, err := os.Create("F:/futureWeb/goLang/testFile.go")
- 参数:name。打开文件的路径:绝对路径、相对路径
- 目录分隔符:
/
- 文件不存在,则创建。文件存在,则将文件内容清空。
-
打开文件 Open
- 参数:name。打开文件的路径:绝对路径、相对路径
- 以只读方式打开文件。文件不存在,则打开失败。
f, err := os.Open("F:/futureWeb/goLang/testFile.go")
-
打开文件 OpenFile
f, err := os.OpenFile("F:/futureWeb/goLang/testFile.go", os.O_RDONLY, 6)
- 参数1:name。打开文件的路径:绝对路径、相对路径
- 参数2:打开文件权限:
O_RDONLY
(只读模式)、O_WRONLY
(只写模式)、O_RDWR
(可读可写模式)、O_APPEND
(追加模式)。 - 参数3:perm,表权限取值范围(0-7)一般传 6
- 0:没有任何权限
- 1:执行权限(如果是可执行文件,是可以运行的)
- 2:写权限
- 3:写权限与执行权限
- 4:读权限
- 5:读权限与执行权限
- 6:读权限与写权限
- 7:读权限、写权限、执行权限
写文件
-
按字符串写:
n, err := f.WriteString("123")
- n:写入的字符个数
- 回车换行:windows:
\r\n
, Linux:\n
-
按位置写:
off, _ := f.Seek(10, io.SeekEnd)
- 参数1:偏移量。正:向文件未偏,负:向文件头偏
- 参数2:偏移起始位置
-
io.SeekStart
:文件起始位置 -
io.SeekCurrent
:文件当前位置 -
io.SeekEnd
:文件结尾位置
-
- 返回值:表示从文件起始位置,到当前读写指针位置的偏移量
-
按字节写:
n, _ := f.WriteAt([]byte("111"), 10)
-
WriteAt()
:在文件指定偏移位置,写入[]byte
, 通常搭配Seek()
- 参数1:待写入数据
- 参数2:偏移量
- 返回值:实际写出的字节数
-
读文件
-
按行读
-
创建一个带有缓冲区的 Reader(读写器)
reader := bufio.NewReader(f) // f: 打开的文件指针
-
从 Reader 的缓冲区中,读取指定长度的数据。数据长度取决于 参数(dlime)
buf, er := reader.ReadBytes('\n') // 按行读
判断到达文件结尾:
if err != nil && err == io.EOF
到文件结尾
文件结尾标识是要单独读一次获取到的。缓冲区:内存中的一块区域,用来减少物理磁盘访问操作。
-
-
按字节读文件
read([]byte)
删文件
Remove
func Remove(name string) Error
调用该函数就可以删除文件名为 name 的文件
目录操作
-
打开目录:os.OpenFile
f, err := os.OpenFile(path, os.O_WRONLY, os.ModeDir)
- 打开目录 OpenFile:以只读方式打开目录。
- 参数1:name,打开目录的路径:绝对路径、相对路径
- 参数2:打开目录权限:O_RDONLY
- 参数3:os.ModeDir
- 返回值:返回一个可以读目录的文件指针
-
读目录:Readdir
info, err := f.Readdir(-1)
- 参数:想要打开的目录项个数。-1,表示所有。
- 返回值:FileInfo
- 原型:
type FileInfo interface { Name() string // base name of the file Size() int64 // length in bytes for regular files; system-dependent for others Mode() FileMode // file mode bits ModTime() time.Time // modification time IsDir() bool // abbreviation for Mode().IsDir() Sys() interface{} // underlying data source (can return nil) } func(f *File) Readdir(n int) ([]FileInfo, err) { FileInfo }
-
直接读目录:ioutil.ReadDir
info, err := ioutil.ReadDir(path)
- 参数:path,打开目录的路径:绝对路径、相对路径
-
其他目录操作
-
将当前工作目录修改为 dir 指定的目录
func Chdir(dir string) error
-
返回当前工作目录的绝对路径
func Getwd(dir string, err error)
-
使用指定的权限和名称创建一个目录
func MKdir(name string, perm FileMode) error
-
使用案例:查询单词在目录中出现的次数
package main
import (
"bufio"
"fmt"
"io"
"io/ioutil"
"os"
"strings"
)
func readFile(path, word string) int {
fp, err := os.Open(path)
if err != nil {
fmt.Println("Open error: ", err)
}
defer fp.Close()
row := bufio.NewReader(fp) // 创建一个reader
var total int = 0 // 统计单词总数的变量
for {
buf, err := row.ReadBytes('\n')
if err != nil && err == io.EOF {
break
}
total += wordCount(string(buf[:]), word)
}
return total
}
func wordCount(s, word string) int {
arr := strings.Fields(s) //分割字符串,存入数组
m := make(map[string]int)
//对 arr 中的每个单词进行循环,存入 map 中统计
for i := 0; i < len(arr); i++ {
m[arr[i]] ++
}
for k, v := range m {
if k == word {
fmt.Printf("%s : %d\n", k, v)
return m[k]
}
}
return 0
}
//从一个文件中逐行读取内容,统计该文件共有多少个单词
func main() {
fmt.Println("请输入需要查询的目录:")
var path string // 获取用户指定的目录名
fmt.Scan(&path)
fmt.Println("请输入需要查询的单词:")
var word string // 获取用户指定的单词
fmt.Scan(&word)
if !strings.HasSuffix(path, "/") {
path += "/"
}
fileList, _ := ioutil.ReadDir(path)
var allCount int = 0
for _, fileInfo := range fileList {
if !fileInfo.IsDir() {
s := fileInfo.Name()
if strings.HasSuffix(s, ".txt") {
allCount += readFile(path + s, word)
}
}
}
fmt.Printf("目录所有文件中共有 %d 个 %s", allCount, word)
}