Go语言文件操作

package main
 
import (
    "errors"
    "fmt"
    "io"
    "io/ioutil"
    "os"
    "path/filepath"
    "strings"
)
 
func main() {
    fileName := "E://wdy.txt"
    filePath := "E://path//wang/dong//yang//wdy01.txt"
 
    //1.读取文件内容
    readFileContent(fileName)
 
    //2.判断文件是否存在
    isExists, _ := isPathOrFileExists(fileName)
    fmt.Println(isExists)
 
    //3.创建目录
    createDir(filePath)
 
    //4.复制文件
    err := copyFile(fileName, filePath)
    if err == nil {
        fmt.Println("文件复制成功!")
    }
 
    //5.复制目录
    err := copyDir("F://mydoc//note", "E://path//wang/dong")
    if err == nil {
        fmt.Println("文件夹复制成功!")
    }
 
    /* 6.往文件中写入内容
    func WriteFile(filename string, data []byte, perm os.FileMode) error
    WriteFile 向文件 filename 中写入数据 data,
    如果文件不存在,则以 perm 权限创建该文件
    如果文件存在,则先清空文件,然后再写入
    返回:error
    */
    data := []byte("Hello World!\n第二行222\n第三行333\n第4行")
    err := ioutil.WriteFile(fileName, data, os.ModeAppend)
    if err == nil {
        fmt.Println("写入成功!")
    }
 
}
 
/*
    根据文件全路径读取文件内容
    @filename文件全路径
*/
func readFileContent(filename string) {
    //读取文件中的所有数据,返回([]byte, error)
    content, err := ioutil.ReadFile(filename)
    if err != nil {
        fmt.Println("读取失败,发生错误!")
    }
    lines := strings.Split(string(content), "\n") //按照回车换行分割
    for index, line := range lines {
        fmt.Printf("第%d%s", index, "行: ")
        fmt.Printf("%s", line)
    }
    fmt.Println("\n共", len(lines), "行")
}
 
/*
    判断目录或文件是否存在
    @path文件/目录的路径
    返回 bool,error
*/
func isPathOrFileExists(path string) (bool, error) {
    // 判断不存在
    if _, err := os.Stat(path); os.IsNotExist(err) {
        // 不存在
        fmt.Println("目录/文件不存在!")
    }
    // 判断是否存在
    _, err := os.Stat(path) //os.Stat()这个函数是获取文件的信息(fi FileInfo, err error)
    if err == nil {
        return true, nil
    }
    if os.IsNotExist(err) { //看返回的错误信息是否不存在,ture不存在,false存在
        return false, nil
    }
    return true, err
}
 
/*
    文件目录操作
    @filepath 要被创建的目录
*/
func createDir(filepath string) {
    // 级联创建目录
    err := os.MkdirAll(filepath, 0777)
    if err != nil {
        fmt.Println("创建成功!")
    } else {
        fmt.Println("目录已存在!") //如果上级目录以及存在,则err同样是nil,但下级目录仍然被创建
    }
}
 
/*
    拷贝文件
    @source 源文件
    @dest  目标文件
    返回 error
*/
func copyFile(source string, dest string) (err error) {
    sf, err := os.Open(source) //读取源文件,返回(*File, error)
    if err != nil {
        return err
    }
    defer sf.Close()
    df, err := os.Create(dest) //创建目标文件
    if err != nil {
        return err
    }
    defer df.Close()
    _, err = io.Copy(df, sf) //复制文件
    if err == nil {
        fi, err := os.Stat(source)
        if err != nil {
            err = os.Chmod(dest, fi.Mode())
        }
    }
    return
}
 
/*
    拷贝目录(包括其下所有子孙目录和文件)
    @source 源目录
    @dest  目标目录
    返回 error
*/
func copyDir(source string, dest string) (err error) {
    fi, err := os.Stat(source) //获取源目录
    if err != nil {
        return err
    }
    if !fi.IsDir() {
        //返回自定义的错误提示
        return errors.New(source + " is not a directory")
    }
    err = os.MkdirAll(dest, fi.Mode()) //创建和源目录权限一致的文件夹
    if err != nil {
        return err
    }
    entries, err := ioutil.ReadDir(source) //读取目录下的所有文件,返回([]os.FileInfo, error)
    for _, entry := range entries {
        /*FileInfo普及:
        type FileInfo interface {
            Name() string        // base name of the file 文件名.扩展名 Git-cmd.txt
            Size() int64        // 文件大小,字节数 12540
            Mode() FileMode        // 文件权限 -rw-rw-rw-
            ModTime() time.Time    // 修改时间 2017-03-22 14:35:35.6483063 +0800 CST
            IsDir() bool        // 是否文件夹
            Sys() interface{}    // 基础数据源接口(can return nil)
        }
        */
        fmt.Println("这是一个os.FileInfo: ", entry.Name(), entry.IsDir(), entry.Mode(), entry.ModTime(), " 大小:", entry.Size(), " Sys:", entry.Sys())
        sfp := filepath.Join(source, entry.Name()) //将源目录和文件/下层目录拼接在一起
        dfp := filepath.Join(dest, entry.Name())
        if entry.IsDir() {
            err = copyDir(sfp, dfp) //递归
            if err != nil {
                fmt.Println(err)
            }
        } else {
            err = copyFile(sfp, dfp)
            if err != nil {
                fmt.Println(err)
            }
        }
    }
    return nil
}

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一掬净土

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值