Go语言文件操作

来源:互联网 发布:霍尼韦尔监控软件下载 编辑:程序博客网 时间:2024/05/28 05:13
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
}
                                             
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 监控主机密码忘了怎么办 加购物车不下单怎么办 绑定qq账号消息不见了怎么办 现在的注册微信怎么办 爱奇艺手机号码被别人绑定了怎么办 手机号码换了支付宝账号怎么办 qq换手机号了怎么办呢 公司被注销了公众号怎么办 qq号被限制查找怎么办 qq号别人查找不到怎么办 qq邮箱已被注册怎么办 微信付款没网络怎么办 天猫买的假货店铺关门了怎么办 鞋小了半码怎么办 迅雷会员种子不能加速怎么办 迅雷会员为什么不能加速怎么办 持有st创智股票怎么办 租的房子床坏了怎么办 宜家定时器不响怎么办 新插座插不进去怎么办 本溪人社app打不开怎么办 南宁电车超过上牌时间怎么办 苹果6s降频怎么办 0首付手机还不起怎么办 乐才app登录不上怎么办 买了笔记本网要怎么办? 电脑连接不上网络怎么办 电脑上没网络了怎么办 手机返回键不好使怎么办 笔记本无线网连接受限怎么办 魅族打电话图标没有了怎么办 京东价格保护后发票怎么办 淘宝未满十八岁怎么办 SVN提交时代码冲突怎么办 京东自营没货了怎么办 京东下了单 没货怎么办 万达广场购物卡怎么办 京东白条没额度怎么办 京东退款还收到货怎么办 退货不想要货了怎么办 安装微擎创建数据库失败怎么办