您的位置:首页 > 编程语言 > Go语言

Go语言文件操作

2017-04-19 22:57 639 查看
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

}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  go file path os