golang 编程笔记

【golang】常用文件操作

2020-07-16  本文已影响0人  dongzd

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

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
}

上一篇下一篇

猜你喜欢

热点阅读