打開朱躺、創(chuàng)建文件
-
創(chuàng)建文件 Create
file, err := os.Create("F:/futureWeb/goLang/testFile.go")
- 參數(shù):name。打開文件的路徑:絕對(duì)路徑、相對(duì)路徑
- 目錄分隔符:
/
- 文件不存在,則創(chuàng)建摩钙。文件存在,則將文件內(nèi)容清空查辩。
-
打開文件 Open
- 參數(shù):name胖笛。打開文件的路徑:絕對(duì)路徑网持、相對(duì)路徑
- 以只讀方式打開文件。文件不存在长踊,則打開失敗功舀。
f, err := os.Open("F:/futureWeb/goLang/testFile.go")
-
打開文件 OpenFile
f, err := os.OpenFile("F:/futureWeb/goLang/testFile.go", os.O_RDONLY, 6)
- 參數(shù)1:name。打開文件的路徑:絕對(duì)路徑身弊、相對(duì)路徑
- 參數(shù)2:打開文件權(quán)限:
O_RDONLY
(只讀模式)辟汰、O_WRONLY
(只寫模式)、O_RDWR
(可讀可寫模式)阱佛、O_APPEND
(追加模式)帖汞。 - 參數(shù)3:perm,表權(quán)限取值范圍(0-7)一般傳 6
- 0:沒(méi)有任何權(quán)限
- 1:執(zhí)行權(quán)限(如果是可執(zhí)行文件凑术,是可以運(yùn)行的)
- 2:寫權(quán)限
- 3:寫權(quán)限與執(zhí)行權(quán)限
- 4:讀權(quán)限
- 5:讀權(quán)限與執(zhí)行權(quán)限
- 6:讀權(quán)限與寫權(quán)限
- 7:讀權(quán)限翩蘸、寫權(quán)限、執(zhí)行權(quán)限
寫文件
-
按字符串寫:
n, err := f.WriteString("123")
- n:寫入的字符個(gè)數(shù)
- 回車換行:windows:
\r\n
, Linux:\n
-
按位置寫:
off, _ := f.Seek(10, io.SeekEnd)
- 參數(shù)1:偏移量淮逊。正:向文件未偏催首,負(fù):向文件頭偏
- 參數(shù)2:偏移起始位置
-
io.SeekStart
:文件起始位置 -
io.SeekCurrent
:文件當(dāng)前位置 -
io.SeekEnd
:文件結(jié)尾位置
-
- 返回值:表示從文件起始位置,到當(dāng)前讀寫指針位置的偏移量
-
按字節(jié)寫:
n, _ := f.WriteAt([]byte("111"), 10)
-
WriteAt()
:在文件指定偏移位置泄鹏,寫入[]byte
, 通常搭配Seek()
- 參數(shù)1:待寫入數(shù)據(jù)
- 參數(shù)2:偏移量
- 返回值:實(shí)際寫出的字節(jié)數(shù)
-
讀文件
-
按行讀
-
創(chuàng)建一個(gè)帶有緩沖區(qū)的 Reader(讀寫器)
reader := bufio.NewReader(f) // f: 打開的文件指針
-
從 Reader 的緩沖區(qū)中郎任,讀取指定長(zhǎng)度的數(shù)據(jù)。數(shù)據(jù)長(zhǎng)度取決于 參數(shù)(dlime)
buf, er := reader.ReadBytes('\n') // 按行讀
判斷到達(dá)文件結(jié)尾:
if err != nil && err == io.EOF
到文件結(jié)尾
文件結(jié)尾標(biāo)識(shí)是要單獨(dú)讀一次獲取到的命满。緩沖區(qū):內(nèi)存中的一塊區(qū)域涝滴,用來(lái)減少物理磁盤訪問(wèn)操作。
-
-
按字節(jié)讀文件
read([]byte)
刪文件
Remove
func Remove(name string) Error
調(diào)用該函數(shù)就可以刪除文件名為 name 的文件
目錄操作
-
打開目錄:os.OpenFile
f, err := os.OpenFile(path, os.O_WRONLY, os.ModeDir)
- 打開目錄 OpenFile:以只讀方式打開目錄胶台。
- 參數(shù)1:name歼疮,打開目錄的路徑:絕對(duì)路徑、相對(duì)路徑
- 參數(shù)2:打開目錄權(quán)限:O_RDONLY
- 參數(shù)3:os.ModeDir
- 返回值:返回一個(gè)可以讀目錄的文件指針
-
讀目錄:Readdir
info, err := f.Readdir(-1)
- 參數(shù):想要打開的目錄項(xiàng)個(gè)數(shù)诈唬。-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)
- 參數(shù):path铸磅,打開目錄的路徑:絕對(duì)路徑赡矢、相對(duì)路徑
-
其他目錄操作
-
將當(dāng)前工作目錄修改為 dir 指定的目錄
func Chdir(dir string) error
-
返回當(dāng)前工作目錄的絕對(duì)路徑
func Getwd(dir string, err error)
-
使用指定的權(quán)限和名稱創(chuàng)建一個(gè)目錄
func MKdir(name string, perm FileMode) error
-
使用案例:查詢單詞在目錄中出現(xiàn)的次數(shù)
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) // 創(chuàng)建一個(gè)reader
var total int = 0 // 統(tǒng)計(jì)單詞總數(shù)的變量
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) //分割字符串,存入數(shù)組
m := make(map[string]int)
//對(duì) arr 中的每個(gè)單詞進(jìn)行循環(huán)阅仔,存入 map 中統(tǒng)計(jì)
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
}
//從一個(gè)文件中逐行讀取內(nèi)容吹散,統(tǒng)計(jì)該文件共有多少個(gè)單詞
func main() {
fmt.Println("請(qǐng)輸入需要查詢的目錄:")
var path string // 獲取用戶指定的目錄名
fmt.Scan(&path)
fmt.Println("請(qǐng)輸入需要查詢的單詞:")
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 個(gè) %s", allCount, word)
}