文件操作的大多數函數都是在os包里面
## 目錄操作
**創建目錄**
```
func Mkdir(name string, perm FileMode) error
```
創建名稱為name的目錄,權限設置是perm,例如0777。
```
package main
import (
"fmt"
"os"
)
func main(){
err := os.Mkdir("readme", 0777)
if err != nil{
fmt.Println(err)
}
}
// 當目錄存在時報錯:
// mkdir readme: Cannot create a file when that file already exists.
```
**創建多級目錄**
```
func MkdirAll(path string, perm FileMode) error
```
根據path創建多級子目錄
```
package main
import (
"fmt"
"os"
)
func main(){
// 目錄存在不會報錯
err := os.MkdirAll("readme/first/second", 0777)
if err != nil{
fmt.Println(err)
}
}
```
**刪除目錄/文件**
```
func Remove(name string) error
```
刪除名稱為name的目錄,當目錄下有文件或者其他目錄會出錯。
```
package main
import (
"fmt"
"os"
)
func main(){
err := os.Remove("readme")
if err != nil{
fmt.Println(err)
}
}
// 刪除不為空的目錄:remove readme: The directory is not empty.
```
**刪除多級目錄**
```
func RemoveAll(path string) error
```
刪除path(包括)及其下級子目錄。
```
package main
import (
"fmt"
"os"
)
func main(){
err := os.RemoveAll("readme")
if err != nil{
fmt.Println(err)
}
}
```
## 文件操作
**創建文件**
```
func Create(name string) (file *File, err Error)
```
根據提供的文件名創建新的文件,返回一個文件對象,默認權限是0666的文件,返回的文件對象是可讀寫的
```
package main
import (
"fmt"
"os"
)
func main(){
file, err := os.Create("readme.txt")
if err != nil{
fmt.Println(err)
}
fmt.Println(file) // &{0xc0000cc780}
}
```
如果文件已經存在則會刪除源文件重新創建
**打開文件**
```
func OpenFile(name string, flag int, perm uint32) (file *File, err Error)
```
打開名稱為name的文件,flag是打開的方式:只讀、讀寫等,perm是權限。
flag 標簽如下
```
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 // 如果可能,打開時清空文件
)
```
```
func Open(name string) (file *File, err Error)
```
該方法打開一個名稱為name的文件,但是只讀方式,內部實現調用了OpenFile。
**寫文件**
寫入byte類型的信息到文件
```
func (file *File) Write(b []byte) (n int, err Error)
```
在指定位置開始寫入byte類型的信息。
```
func (file *File) WriteAt(b []byte, off int64) (n int, err Error)
```
寫入string信息到文件。
```
func (file *File) WriteString(s string) (ret int, err Error)
```
**讀文件**
讀取數據到b中
```
func (file *File) Read(b []byte) (n int, err Error)
```
從off開始讀取數據到b中。
```
func (file *File) ReadAt(b []byte, off int64) (n int, err Error)
```
**獲取文件信息**
```
package main
import (
"fmt"
"log"
"os"
)
var (
fileInfo os.FileInfo
err error
)
func main() {
// 如果文件不存在,則返回錯誤
fileInfo, err = os.Stat("index.html")
if err != nil {
log.Fatal(err)
}
fmt.Println("文件名稱:", fileInfo.Name())
fmt.Println("文件大小:", fileInfo.Size())
fmt.Println("文件權限:", fileInfo.Mode())
fmt.Println("最后修改時間:", fileInfo.ModTime())
fmt.Println("是否是目錄: ", fileInfo.IsDir())
}
```
打印結果
```
文件名稱: index.html
文件大小: 2677
文件權限: -rw-rw-rw-
最后修改時間: 2021-03-11 19:25:20.0098714 +0800 CST
是否是目錄: false
```
移動和重命名
```
package main
import (
"log"
"os"
)
func main() {
originalPath := "index.html"
newPath := "test/index.html"
// 移動到同一目錄下為重命名
err := os.Rename(originalPath, newPath)
if err != nil {
log.Fatal(err)
}
}
```
**判斷文件是否存在**
```
package main
import (
"fmt"
"log"
"os"
)
func main() {
// 文件不存在則返回error
fileInfo, err := os.Stat("./index2.html")
if err != nil {
if os.IsNotExist(err) {
log.Fatal("File does not exist.")
}
}
fmt.Println("File does exist. File information:")
fmt.Println(fileInfo)
}
```