0.5.文件常用函数(2018.02.14)
使用之前请先引入:
import (
    "fmt"
    "os"
)


1.建立与打开文件:

1).新建文件

定义:根据提供的文件名创建一个新文件,返回一个文件对象,默认权限是0666,返回的文件对象是可读写的。

func Create(name string) (file *File, err Error){}

用法:

fileName := "E://wyw.txt"

fout, err := os.Create(fileName)    //新建文件
if err != nil {
    fmt.Println(err)
    return
}
defer fout.Close()                         //关闭文件


2).打开文件:

定义:

函数1:该方法以只读方式打开一个名称为name的文件,内部实现其实调用了OpenFile

func Open(name string) (file *File, err Error){}

函数2:打开名称为name的文件,flag是打开的方式,只读、读写等,perm是权限。

func OpenFile(name string, flag int, perm uint32) (file *File, err Error){}

用法:

fileName := "E://wyw.txt"

fout, err := os.OpenFile(fileNameos.O_CREATE0666)
if err != nil {
    fmt.Println(err)
    return
}
defer fout.Close()                          // 关闭文件




2.写文件:

方法1:写入[]byte类型的数据到文件。
func (file *File) Write(b []byte) (n int, err Error){}

方法2:从指定位置开始写入byte类型的信息。

func (file *File) WriteAt(b []byte, off int64) (n int, err Error){}

方法3:写入string数据到文件。

func (file *File) WriteString(s string) (ret int, err Error){}


 


3.读文件:

方法1:读取数据到[]byte中。
func (file *File) Read(b []byte) (n int, err Error){}

方法2:从off开始读取数据到[]byte中。

func (file *File) ReadAt(b []byte, off int64) (n int, err Error){}



 

4.删除文件:

函数1:调用该函数就可以删除文件名为name的文件。
func Remove(name string) Error{}

用法:

os.Remove("E://wyw.txt")

函数2:调用该函数就可以删除目录名为path的目录。

func RemoveAll(path string) Error{}

用法:

 os.RemoveAll("E://path")



5.案例:

1).写文件:

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    fileName := "E://wyw.txt"
    fout, err := os.Create(fileName)  //新建文件
    if err != nil {
        fmt.Println(err)
        return
    }

    defer fout.Close()       //关闭文件

    //方法1:写入string数据到文件
    for i := 0; i < 5; i++ {
        outstr := fmt.Sprintf("%s:%d\n", "Hello go", i)
        fout.WriteString(outstr)
    }

    //方法2:写入[]byte类型的数据到文件
    for i := 0; i < 5; i++ {
        fout.Write([]byte("abcd\n"))
    }

    //方法3:从指定位置开始写,位置从0开始
    fout.WriteAt([]byte("123456789"), 5)

    //方法4:利用缓冲写数据,返回写入字节个数(一个中文3个字节)
    w := bufio.NewWriter(fout)
    n4, err3 := w.WriteString("缓冲:bufferedn")
    fmt.Println(n4)
    if err3 != nil {
        fmt.Println(err3)
        return
    }
    w.Flush()
}

wyw.txt内容如下(换行也会当成一个字符被替换掉):

Hello123456789lo go:1
Hello go:2
Hello go:3
Hello go:4
abcd
abcd
abcd
abcd
abcd
缓冲:bufferedn


2).读文件:

package main

import (
    "fmt"
    "os"
)

func main() {
    fileName := "E://wyw.txt"
    fin, err := os.Open(fileName)     //打开文件
    if err != nil {
        fmt.Println(err)
    }
    defer fin.Close()

    buf := make([]byte, 1024)        //开辟1024个字节的slice作为缓冲
    for {
        n, _ := fin.Read(buf)             //读文件
        if n == 0 {                            //0表示已经到文件结束
            break
        }

        fmt.Println(string(buf))        //输出读取的内容
    }
   
}




6.常用函数封装(见附件):
package util

import (
    "errors"
    "io"
    "io/ioutil"
    "os"
    "path/filepath"
)

/*
   1.根据文件全路径读取文件内容
   @filename文件全路径
*/
func ReadFileContent(filename string) (string, error) {
    //读取文件中的所有数据,返回([]byte, error)
    content, err := ioutil.ReadFile(filename)
    if err != nil {
        return "", errors.New("读取失败,发生错误!")
    }
    return string(content), nil
}

/*
   2.判断目录或文件是否存在
   @path 文件/目录的路径
*/
func IsPathOrFileExists(path string) (bool, error) {
    _, err := os.Stat(path)                     //os.Stat()这个函数是获取文件的信息(fi FileInfo, err error)
    if err != nil || os.IsNotExist(err) {     //看返回的错误信息是否不存在,ture不存在,false存在
        return false, nil
    }
    return true, err
}

/*
   3.创建文件目录
   @filepath 要被创建的目录
*/
func CreateDir(filepath string) (bool, error) {
    _, err := os.Stat(filepath)        //os.Stat()这个函数是获取文件的信息(fi FileInfo, err error)
    if err == nil || !os.IsNotExist(err) {
        return false, errors.New("目录已存在!")
    }

    // 级联创建目录
    err = os.MkdirAll(filepath, 0666)
    if err != nil {
        return false, errors.New("目录创建失败!")
    }
    return true, nil
}

/*
   4.拷贝文件
   @source 源文件
   @dest  目标文件
*/
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
}

/*
   5.拷贝目录(包括其下所有子孙目录和文件)
   @source 源目录
   @dest  目标目录
*/
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 + " 不是一个目录")
    }
    err = os.MkdirAll(dest, fi.Mode())    //创建和源目录权限一致的文件夹
    if err != nil {
        return err
    }
    entries, err := ioutil.ReadDir(source)    //读取目录下的所有文件,返回([]os.FileInfo, error)
    for _, entry := range entries {
        //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 {
                return err
            }
        } else {
            err = CopyFile(sfp, dfp)
            if err != nil {
                return err
            }
        }
    }
    return nil
}

使用上面封装的函数:

package main

import (
    "fmt"
    "io/ioutil"
    "os"
    "util"
)

func main() {
    fileName := "E://wyw.txt"
    filePath := "E://path//wang//you//wen//"

    //1.读取文件内容
    content, err := util.ReadFileContent(fileName)
    if err != nil {
        fmt.Println("文件读取错误:", err)
    } else {
        fmt.Println(content)
    }

    //2.判断文件是否存在
    isExists, _ := util.IsPathOrFileExists(fileName)
    fmt.Println(isExists)

    //3.创建目录
    createOk, err1 := util.CreateDir(filePath)
    if err1 != nil {
        fmt.Println("创建目录失败:", err1)
    } else {
        fmt.Println(createOk)
    }

    //4.复制文件
    err = util.CopyFile(fileName, filePath+"//wyw888.txt")
    if err == nil {
        fmt.Println("文件复制成功!")
    }

    //5.复制目录
    err = util.CopyDir("E://path", "E://path1")
    if err == nil {
        fmt.Println("文件夹复制成功!")
    }

    /* 6.往文件中写入内容
       WriteFile 向文件 filename 中写入数据 data,
       如果文件不存在,则以 perm 权限创建该文件
       如果文件存在,则先清空文件,然后再写入
       返回:error
    */
    data := []byte("Hello World!\n第二行222\n第三行333\n第4行")
    err2 := ioutil.WriteFile(fileNamedata, os.ModeAppend)
    if err2 == nil {
        fmt.Println("写入成功!")
    }

   workdir, _ := os.Getwd()   //获取项目目录
    fmt.Println(workdir)   //F:\godevelop\test\src
    //将"E://www"整个目录压缩到"E://test"目录下,命名为wywtar.tar.gz
    util.Dirtotar("E://www", "E://test", "wywtar") //该方法参考附件文件
}
注:有些方法未列出,具体内容请参考fileUtil.go文件。





 

阅读更多
个人分类: GoLang
想对作者说点什么? 我来说一句

bcdautofix v1[1].0.5

2013年03月23日 410KB 下载

常用函数连续傅里叶变换对照表

2018年04月15日 142KB 下载

没有更多推荐了,返回首页

不良信息举报

0.5.文件常用函数(2018.02.14)

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭