一、在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读写文件

  • 1、参数介绍

    // 第一个参数的文件路径,第二个参数打开文件的方式,第三个参数是随便写的整数
    /**
        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  // 如果可能,打开时清空文件
     */
    
  • 2、案例一:普通的写入一个文件

    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()
        }
    }
    
  • 3、案例二:覆盖之前的文件写入

    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()
    }
    
  • 4、案例三:追加的方式写入文件

    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()
    }
    
  • 5、案例四:读写一起使用

    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("-----------输入完成-----------")
    }
    

五、文件的拷贝

  • 1、文件内容的拷贝(已知两个文件都存在)

    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("写入文件错误")
        }
    }
    
  • 2、整个文件的拷贝

    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)
    }