golang读写文件夹和文件操作

/*
  递归创建目录
  os.MkdirAll(path string, perm FileMode) error
 第一个参数是路径,第二个是权限。如果文件夹不存在就创建,存在则不做任何操作。

  path  目录名及子目录
  perm  目录权限位
  error 如果成功返回nil,如果目录已经存在默认什么都不做
  
*/

package main;
 
import (
    "os"
    "log"
    "time"
    "fmt"
)
 
//一些常用的文件操作函数
 
func main() {
    //创建目录
    //perm权限设置,os.ModePerm为0777
    err := os.Mkdir("./tmp", os.ModePerm);
    if err != nil {
        log.Fatal(err);
    }
 
    //创建多级目录
    err2 := os.MkdirAll("./a/b/c", os.ModePerm);
    if err2 != nil {
        log.Fatal(err2);
    }
 
    //等个3秒,看目录是否创建成功
    time.Sleep(time.Second * 3);
 
    //删除目录
    //如果目录下有文件或其他目录会出错
    err3 := os.Remove("./tmp");
    if err3 != nil {
        log.Fatal(err3);
    }
 
    //删除多级目录
    //如果是单个名称,则删除所有子目录
    err4 := os.RemoveAll("./a/b/c");
    if err4 != nil {
        log.Fatal(err4);
    }
 
    //文件操作
    //创建文件
    //Create会返回一个文件对象,默认权限0666
    file1, err5 := os.Create("./1.log");
    defer file1.Close();
    if err5 != nil {
        log.Fatal(err5);
    }
 
    //通过文件描述符(文件句柄)来创建文件
    file2 := os.NewFile(file1.Fd(), "./2.log");
    defer file2.Close();
 
    //打开文件
    //Open内部调用OpenFile,以只读方式打开
    file3, err6 := os.Open("./1.txt");
    defer file3.Close();
    if err6 != nil {
        log.Fatal(err6);
    }
 
    //OpenFile指定文件打开方式,只读,只写,读写和权限
    file4, err7 := os.OpenFile("./2.txt", os.O_RDWR, 0666);
    defer file4.Close();
    if err7 != nil {
        log.Fatal(file4);
    }
 
    //向文件写入数据
    file4.Write([]byte("我写入数据"));
 
    //在指定位置写入数据
    file4.WriteAt([]byte("指定位置写入数据"), 1024);
 
    //直接写入string
    file4.WriteString("你好世界");
 
    //读取文件数据
 
    //将文件偏移量设置为开头
    file4.Seek(0, 0);
    tmp := make([]byte, 256);
    //Read读取数据到[]byte中
    for n, _ := file4.Read(tmp); n != 0; n, _ = file4.Read(tmp) {
        fmt.Println(string(tmp));
    }
 
    //ReadAt从off指定位置读取数据到[]byte中
    file4.Seek(0, 0);
    var off int64 = 0;
    for {
        n, _ := file4.ReadAt(tmp, off);
        off += int64(n);
        if n == 0 {
            break;
        }
 
        fmt.Println(string(tmp));
    }
 
    //删除文件
    //Go中删除文件和删除文件夹同一个函数
    err8 := os.Remove("./1.txt");
    if err8 != nil {
        log.Fatal(err8);
    }
}

深入:

一、判断文件或文件夹是否存在

golang 判断文件或者文件夹是否存在可以通过os.stat() 方法和os.IsExist() 方法来判断:

func isExist(path string)(bool){
    _, err := os.Stat(path)
    if err != nil{
        if os.IsExist(err){
            return true
        }
        if os.IsNotExist(err){
            return false
        }
        fmt.Println(err)
        return false
    }
    return true
}

测试:

package main
import (
    "os"
    "fmt"
)
//判断文件或文件夹是否存在
func isExist(path string)(bool){
    _, err := os.Stat(path)
    if err != nil{
        if os.IsExist(err){
            return true
        }
        if os.IsNotExist(err){
            return false
        }
        fmt.Println(err)
        return false
    }
    return true
}
func main(){
    //递归创建文件夹
    err := os.MkdirAll("./test/1/2", os.ModePerm)
    if err != nil{
        fmt.Println(err)
        return
    }
    dirs := []string{"./test/1", "./test/2", "./test/1.txt"}
    for _, v := range dirs{
        if isExist(v){
            fmt.Printf("%s is exist!", v)
        }else{
            fmt.Printf("%s is not exist!", v)
        }
    }
}

终端查看:

ma@ma:/data/code/go/src/file_exist$ tree
.
└── file_exist.go
0 directories, 1 file
ma@ma:/data/code/go/src/file_exist$ go run file_exist.go  # 运行程序
./test/1 is exist!
./test/2 is not exist!
./test/1.txt is not exist!
ma@ma:/data/code/go/src/file_exist$ tree  
.
├── file_exist.go
└── test
    └── 1
        └── 2
3 directories, 1 file
ma@ma:/data/code/go/src/file_exist$ touch test/1.txt  # 创建1.txt
ma@ma:/data/code/go/src/file_exist$ go run file_exist.go 
./test/1 is exist!
./test/2 is not exist!
./test/1.txt is exist!  # 1.txt存在
二、根据日期创建文件夹

在一些web应用中,往往会根据当前日期创建文件夹,来保存用户的文件等信息,比如

static/product/20170410/
static/product/20170411/

获取日期并创建文件夹这个过程中可能会遇到坑,比如创建的文件夹没有写入的权限,下面给出一段代码,可以解决这个问题:

import (
    "os"
    "path/filepath"
    "time"
)

// CreateDateDir 根据当前日期来创建文件夹
func CreateDateDir(basePath string) string {
    folderName := time.Now().Format("20060102")
    folderPath := filepath.Join(basePath, folderName)
    if _, err := os.Stat(folderPath); os.IsNotExist(err) {
        // 必须分成两步
        // 先创建文件夹
        os.Mkdir(folderPath, 0777)
        // 再修改权限
        os.Chmod(folderPath, 0777)
    }
    return folderPath
}

一种就是上面的两步走,另一种就是利用修改掩码:

import (
    "os"
    "path/filepath"
    "time"
    "syscall"
)

// CreateDateDir 根据当前日期来创建文件夹
func CreateDateDir(basePath string) string {
    folderName := time.Now().Format("20060102")
    folderPath := filepath.Join(basePath, folderName)
    if _, err := os.Stat(folderPath); os.IsNotExist(err) {
        oldMask := syscall.Umask(0)
        os.Mkdir(folderPath, os.ModePerm)
        syscall.Umask(oldMask)
    }
    return folderPath
}

根据日期创建文件夹路径

uploadDir := "static/upload/" + time.Now().Format("2006/01/02/")
err := os.MkdirAll( uploadDir , 777)

用os.path.join()连接两个文件名地址的时候,就比如

os.path.join("D:","test.txt") \结果是D:\test.txt

删除指定目录下所有文件

os.Remove("abc/d/e/f")

删除指定目录

os.RemoveAll("abc")

重命名文件

os.Rename("./2.txt", "./2_new.txt")

你可能感兴趣的:(GoLang)