文件操作案例
import (
"bufio"
"fmt"
"io"
"os"
)
//寫入方式一
func main01() {
//路徑分為絕對路徑和相對路徑
//create册着,文件存在則會覆蓋原始內(nèi)容(其實就相當于清空)拴孤,不存在則創(chuàng)建
fp, error := os.Create("./a.txt")
if error != nil {
fmt.Println("文件創(chuàng)建失敗!")
return
}
//延遲調(diào)用,關閉文件
defer fp.Close()
//寫入文件,windows上面換行\(zhòng)r\n其他\n即可
fp.WriteString("hello\r\n")
n, _ := fp.WriteString("world\r\n")
fmt.Println(n) //7 其實就是寫入的內(nèi)容長度world\r\n剛好7
}
//寫入方式二
func main2() {
fp, error := os.Create("./a.txt")
if error != nil {
fmt.Println("文件創(chuàng)建失敗!")
return
}
defer fp.Close()
b := []byte{'h', 'e', 'l', 'l'}
fp.Write(b)
str := "world"
//字符串和切片允許相互轉(zhuǎn)換
b1 := []byte(str)
fp.Write(b1)
}
//寫入方式三:指定位置
func main3() {
//os.Open是只讀打開
/**
讀寫方式:
O_APPEND:追加
O_RDONLY: 只讀
O_RDWR:可讀可寫
O_WRONLY:只寫
*/
//第三個參數(shù)是權限甲捏,取值范圍0-7
/**
0:沒有任何權限
1:執(zhí)行權限(如果是可執(zhí)行文件演熟,是可以運行的)
2:寫權限
3:寫權限與執(zhí)行權限
4:讀權限
5:讀權限與執(zhí)行權限
6:讀權限與寫權限
7:讀權限,寫權限司顿,執(zhí)行權限
*/
//OpenFile無法創(chuàng)建文件
fp, error := os.OpenFile("./a.txt", os.O_RDWR, 6)
if error != nil {
fmt.Println("文件創(chuàng)建失敗!")
return
}
defer fp.Close()
//b:=[]byte("hello")
//執(zhí)行前內(nèi)容aaaaa
//執(zhí)行后內(nèi)容ahello
//fp.WriteAt(b,1)
//獲取文件字符個數(shù),參數(shù)一可以是負數(shù)芒粹,這樣可以往左偏移
n, _ := fp.Seek(0, io.SeekEnd)
b := []byte("hello")
//此時就相當于追加了,因為n此時是內(nèi)容總長度了
fp.WriteAt(b, n) //ahellohello
}
//讀取文件
func main4() {
fp, error := os.Open("./a.txt")
if error != nil {
/**
系統(tǒng)打開文件個數(shù)限制是65535
所以重復打開同一文件是可以的
1. 文件不存在
2. 文件權限
3. 文件打開上限
*/
fmt.Println("文件打開失敗!")
return
}
defer fp.Close()
b := make([]byte, 1024)
//n, error := fp.Read(b)
//fmt.Println(n) //n是長度
fp.Read(b)
//也可以通過for遍歷讀取
fmt.Println(string(b)) //ahellohello
}
func main5() {
fp, error := os.Open("./a.txt")
if error != nil {
fmt.Println("文件打開失敗!")
return
}
defer fp.Close()
b := make([]byte, 20)
for {
n, err := fp.Read(b)
//文件結(jié)束
if err == io.EOF { //-1
break
}
fmt.Print(string(b[:n]))
}
}
func main() {
fp, error := os.Open("./a.txt")
if error != nil {
fmt.Println("文件打開失敗!")
return
}
defer fp.Close()
//行讀取大溜。新建緩沖區(qū)化漆,把內(nèi)容先放到緩沖區(qū)
r := bufio.NewReader(fp)
for {
buf, err := r.ReadBytes('\n')
fmt.Print(string(buf))
//文件結(jié)束,此時必須讀取在上面钦奋,否則最后一行的時候err == io.EOF座云,則永遠會少讀取一行
if err == io.EOF { //-1
break
}
}
}
拷貝文件
func main() {
// 打開讀文件
f_r, err := os.Open("C:/z1/測試.avi")
if err != nil {
fmt.Println("Open err: ", err)
return
}
defer f_r.Close()
// 創(chuàng)建寫文件
f_w, err := os.Create("C:/z1/test.avi")
if err != nil {
fmt.Println("Create err: ", err)
return
}
defer f_w.Close()
// 從讀文件中獲取數(shù)據(jù),放到緩沖區(qū)中付材。
buf := make([]byte, 4096)
// 循環(huán)從讀文件中朦拖,獲取數(shù)據(jù),“原封不動的”寫到寫文件中厌衔。
for {
n, err := f_r.Read(buf)
if err != nil && err == io.EOF {
fmt.Printf("讀完璧帝。n = %d\n", n)
return
}
f_w.Write(buf[:n]) // 讀多少,寫多少
}
}
目錄操作
打開目錄
OpenFile:以只讀方式打開目錄
- 參1:name富寿, 打開目錄的路徑: 絕對路徑裸弦、相對路徑
- 參2:打開目錄權限: O_RDONLY
- 參3:os.ModeDir,
返回值: 返回一個可以讀目錄的 文件指針。
讀目錄:Readdir
原型:func (f *File) Readdir(n int) ([]FileInfo, error) {
參數(shù): 欲打開的目錄項個數(shù)作喘。 -1 , 表所有;例如10晕城,則只讀取十個目錄項
返回值: 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 main() {
// 獲取用戶輸入的目錄路徑
fmt.Println("請輸入待查詢的目錄:")
var path string
fmt.Scan(&path)
// 打開目錄
f, err := os.OpenFile(path, os.O_WRONLY, os.ModeDir)
if err != nil {
fmt.Println("OpenFile err: ", err)
return
}
defer f.Close()
// 讀取目錄項
info, err:= f.Readdir(-1) // -1: 讀取目錄中所有目錄項
if err != nil {
fmt.Println("Readdir err: ", err)
return
}
// 變量返回的切片
for _, fileInfo := range info {
if fileInfo.IsDir() { // 是目錄
fmt.Println(fileInfo.Name(), " 是一個目錄")
} else {
fmt.Println(fileInfo.Name(), " 是一個文件")
}
}
}
MMU
虛擬內(nèi)存映射單元
MMU.png
緩沖區(qū)
緩沖區(qū).png
文件讀寫分為泞坦,系統(tǒng)緩存和用戶緩沖,用戶緩存就是寫代碼時候創(chuàng)建的緩存砖顷,而用戶緩存則是系統(tǒng)內(nèi)部的緩存調(diào)度贰锁,不是每次讀寫都是操作磁頭扇區(qū)等硬件,而是系統(tǒng)盡可能的預讀入緩輸出滤蝠,減少硬件交互豌熄,代碼的讀取和寫入都是讀取和寫入系統(tǒng)緩沖區(qū),真正什么時候?qū)懭胗脖P物咳,有系統(tǒng)內(nèi)部IO優(yōu)化算法操作锣险。
結(jié)構體指針傳參
結(jié)構體指針傳參.png