一、在go
中判断是文件夹还是文件夹的操作
package main
import (
"fmt"
"os"
)
// 传递一个路径进去
func IsFile(path string) bool {
file, err := os.Stat(path)
if err != nil {
return false
}
return !file.IsDir()
}
func main() {
isFile := IsFile("./11.txt")
if isFile {
fmt.Println("是文件")
} else {
fmt.Println("不是文件")
}
}
二、判断文件或者文件夹是否存在
package main
import (
"fmt"
"os"
)
// 使用os.Stat()函数返回的错误值来判断
// 1.如果返回的错误为nil,说明文件或文件夹存在
// 2.如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或文件夹不存在
// 3.返回的错误类型,不能确定是否存现
func PathExists(path string) (bool, error) {
_, err := os.Stat(path)
if err == nil {
return true, nil
}
if os.IsNotExist(err) {
return false, nil
}
return false, err
}
func main() {
ok, err := PathExists("./11.txt")
if ok {
fmt.Println("文件存在")
} else {
fmt.Println("文件不存在")
}
if err != nil {
fmt.Println("不能确定是否存现")
}
}
三、读文件的几种方式
- 1、使用
os.Open()
打开文件和bufio.NewReader
显示到终端
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
// 打开文件
file, err := os.Open("./11.txt")
if err != nil {
fmt.Println("打开失败")
}
defer file.Close()
// 读取文件
reader := bufio.NewReader(file)
// 循环读文件
for {
str, err := reader.ReadString('\n') // 以为\n来读
// 当读写完成后
if err == io.EOF {
break
}
fmt.Print(str)
}
}
- 2、使用
ioutil.ReadFile
直接读取出来的
package main
import (
"fmt"
"io/ioutil"
)
func main() {
content, err := ioutil.ReadFile(11.txt)
if err != nil {
fmt.Println("打开文件失败")
}
fmt.Printf("%v", string(content))
}
四、使用os.OpenFile
读写文件
// 第一个参数的文件路径,第二个参数打开文件的方式,第三个参数是随便写的整数
/**
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 // 如果可能,打开时清空文件
*/
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, err := os.OpenFile("./11.txt", os.O_WRONLY|os.O_CREATE, 1111)
if err != nil {
fmt.Println("打开文件失败")
}
defer file.Close()
str := "水痕111\n"
writer := bufio.NewWriter(file)
for i := 0; i < 10; i++ {
// 因为writer是带缓存的,因此在调用WriteString方法的时候,其实是先将内容写到缓存中,所以需要调用
// Flush方法,将缓冲的数据真实的写入到文件中,否则文件中没有数据
writer.WriteString(str)
writer.Flush()
}
}
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, err := os.OpenFile("./11.txt", os.O_WRONLY | os.O_TRUNC, 111)
if err != nil {
fmt.Println("打开文件失败")
}
defer file.Close()
str :="你好\r\n"
writer := bufio.NewWriter(file)
for i := 0; i< 10; i++ {
writer.WriteString(str)
}
writer.Flush()
}
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, err := os.OpenFile("./11.txt", os.O_WRONLY|os.O_APPEND, 1111)
if err != nil {
fmt.Println("打开文件失败")
}
defer file.Close()
str := "中国你好\r\n"
writer := bufio.NewWriter(file)
for i := 0; i < 10; i++ {
writer.WriteString(str)
}
writer.Flush()
}
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
file, err := os.OpenFile("./11.txt", os.O_RDWR|os.O_APPEND, 1111)
if err != nil {
fmt.Println("打开文件失败")
}
defer file.Close()
reader := bufio.NewReader(file)
for {
str, err := reader.ReadString('\n')
if err == io.EOF {
break
}
fmt.Println(str)
}
fmt.Println("-----------结束显示-----------")
str := "中国你好\r\n"
writer := bufio.NewWriter(file)
for i := 0; i < 10; i++ {
writer.WriteString(str)
}
writer.Flush()
fmt.Println("-----------输入完成-----------")
}
五、文件的拷贝
package main
import (
"fmt"
"io/ioutil"
)
func main() {
data, err := ioutil.ReadFile("./11.txt")
if err != nil {
fmt.Println("读文件错误")
}
err = ioutil.WriteFile("./22.txt", data, 111)
if err != nil {
fmt.Println("写入文件错误")
}
}
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func CopyFile(dstFileName string, srcFileName string) (written int64, err error) {
srcFile, err := os.Open(srcFileName)
if err != nil {
fmt.Println("打开文件失败")
}
defer srcFile.Close()
reader := bufio.NewReader(srcFile)
dstFile, err := os.OpenFile(dstFileName, os.O_WRONLY|os.O_CREATE, 111)
if err != nil {
fmt.Println("打开失败")
}
writer := bufio.NewWriter(dstFile)
defer dstFile.Close()
return io.Copy(writer, reader)
}