package main import ( "fmt" "os" "time" ) func main() { file, e := os.Open("D:/kaka.txt") if e != nil { fmt.Println("文件打开失败") } else { fmt.Println("文件打开成功") } defer func() { file.Close() fmt.Println("文件已关闭") }() fmt.Println("愉快滴欣赏avi艺术") time.Sleep(3 * time.Second) }
注意点
在os.open时,如果你的操作系统时windows这个时候不要打开文件直接复制文件路径,会报一个文件目录的错误
The filename, directory name, or volume label syntax is incorrect.
在打开文件的路径必须自己手动输入,因为编码有问题
打开文件也必须关闭文件,所以在任何时候打开一个文件操作后使用延迟执行的defer来进行关闭文件
defer是延迟执行的关键词,在所有程序都执行完才会执行的代码
文件打开模式
- 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_TRUNC int = syscall.O_TRUNC // 覆盖模式
文件权限
权限详解有什么问题可以看这篇文章,详细的说明了权限的问题。
这里简单的说一下 r w x 分别代表的是什么意思
r表示可读
w表示可写
x表示可执行
任何文件都有使用者,群组,other的概念。 权限所代表的是r = 4 w = 2 x = 1 这块的知识是在linux写过的,就不在继续讨论了。
文件读取
func main() { file, e := os.OpenFile("D:/kaka.txt", os.O_RDONLY, 0666) if e != nil { fmt.Println("文件打开失败:err", e) return } else { fmt.Println("文件打开成功") } // 打开时立刻挂起关闭程序 defer func() { file.Close() fmt.Println("文件关闭成功") }() // 创建文件的读取器 reader := bufio.NewReader(file) // 死循环读取 for { // 以换行符为界,分批次读取数据,得到readString readString, e := reader.ReadString('\n') if e != nil { fmt.Println("文件读取失败;err", e) // 如果已到文件末尾,则直接结束 if e == io.EOF { break } } fmt.Print(readString) } fmt.Println("读取结束") }
func main() { bytes, err := ioutil.ReadFile("d:/kaka.txt") if err != nil { fmt.Println("读取失败,err=", err) return } else { contentStr := string(bytes) fmt.Println(contentStr) } }