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
}