【golang】常用文件操作

dongzaidong · · 232 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

以下是对自己项目中,常用到的文件操作

func FileExists(name string) bool {
    _, err := os.Stat(name)
    if err == nil {
        return true
    }

    if os.IsNotExist(err) {
        return false
    }
    return false
}

// 根据文件内容生成md5,用于比较文件内容是否相同
func GenerateMD5(path string) (string, error) {
    f, err := os.Open(path)
    if err != nil {
        return "", err
    }
    defer f.Close()

    h := md5.New()
    if _, err := io.Copy(h, f); err != nil {
        return "", err
    }
    return fmt.Sprintf("%x", h.Sum(nil)), nil
}

func CompareSum(sum1, sum2 string) bool {
    return sum1 == sum2
}

// 判断给定路径是否为文件夹
func IsDir(path string) bool {
    s, err := os.Stat(path)
    if err != nil {
        return false
    }
    return s.IsDir()
}

// 创建指定文件夹(递归创建)
func CreateDir(dir string) (string, error) {
    b, _ := PathExists(dir)
    if b {
        return dir, nil
    }
    if err := os.MkdirAll(dir, os.ModePerm); err != nil {
        return "", err
    }
    return dir, nil
}

// 指定文件夹下创建文件
func CreateFile(dir string, filename string, sou io.Reader) (string, error) {
    dirPath, err := CreateDir(dir)
    if err != nil {
        return "", err
    }
    path := filepath.Join(dirPath, filename)
    f, err := os.Create(path)
    if err != nil {
        return "", err
    }
    defer f.Close()
    _, err = io.Copy(f, sou)
    if err != nil {
        return "", err
    }
    return path, nil
}

func GetAllFileFromDir(dirPath string) ([]string, error) {
    if !IsDir(dirPath) {
        return nil, errors.New("illegal folder path")
    }
    res := make([]string, 0)
    rd, err := ioutil.ReadDir(dirPath)
    if err != nil {
        return nil, err
    }
    for _, f := range rd {
        if f.IsDir() {
            fs, err := GetAllFileFromDir(filepath.Join(dirPath, f.Name()))
            if err != nil {
                return nil, err
            }
            res = append(res, fs...)
        } else {
            res = append(res, filepath.Join(dirPath, f.Name()))
        }
    }
    return res, nil
}

// 提取路径文件名
func ExtractFileName(path string, includeSuf bool) (string, error) {
    _, err := PathExists(path)
    if err != nil {
        return "", err
    }
    if IsDir(path) {
        return "", errors.New("illegal file path")
    }
    filename := filepath.Base(path)
    if includeSuf {
        return filename, nil
    }
    suf := filepath.Ext(filename)
    return strings.TrimSuffix(filename, suf), nil
}

// 查找文件名与指定md5值相同的文件
func FindFileByMD5(dir string, md5 string) (string, error) {
    if !IsDir(dir) {
        return "", errors.New("illegal folder path")
    }
    paths, err := GetAllFileFromDir(dir)
    if err != nil {
        return "", err
    }
    for _, path := range paths {
        name, err := ExtractFileName(path, false)
        if err != nil {
            return "", err
        }
        if name == md5 {
            return path, nil
        }
    }
    return "", nil
}


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:dongzaidong

查看原文:【golang】常用文件操作

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

232 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传