ClickHouse/programs/diagnostics/internal/platform/utils/file.go
2022-07-04 10:59:39 +02:00

96 lines
2.1 KiB
Go

package utils
import (
"fmt"
"io"
"io/fs"
"os"
"path/filepath"
"github.com/pkg/errors"
)
func FileExists(name string) (bool, error) {
f, err := os.Stat(name)
if err == nil {
if !f.IsDir() {
return true, nil
}
return false, fmt.Errorf("%s is a directory", name)
}
if errors.Is(err, os.ErrNotExist) {
return false, nil
}
return false, err
}
func DirExists(name string) (bool, error) {
f, err := os.Stat(name)
if err == nil {
if f.IsDir() {
return true, nil
}
return false, fmt.Errorf("%s is a file", name)
}
if errors.Is(err, os.ErrNotExist) {
return false, nil
}
return false, err
}
func CopyFile(sourceFilename string, destFilename string) error {
exists, err := FileExists(sourceFilename)
if err != nil {
return err
}
if !exists {
return fmt.Errorf("%s does not exist", sourceFilename)
}
source, err := os.Open(sourceFilename)
if err != nil {
return err
}
defer source.Close()
destDir := filepath.Dir(destFilename)
if err := os.MkdirAll(destDir, os.ModePerm); err != nil {
return errors.Wrapf(err, "unable to create directory %s", destDir)
}
destination, err := os.Create(destFilename)
if err != nil {
return err
}
defer destination.Close()
_, err = io.Copy(destination, source)
return err
}
// patterns passed are an OR - any can be satisfied and the file will be listed
func ListFilesInDirectory(directory string, patterns []string) ([]string, []error) {
var files []string
exists, err := DirExists(directory)
if err != nil {
return files, []error{err}
}
if !exists {
return files, []error{fmt.Errorf("directory %s does not exist", directory)}
}
var pathErrors []error
_ = filepath.Walk(directory, func(path string, info fs.FileInfo, err error) error {
if err != nil {
pathErrors = append(pathErrors, err)
} else if !info.IsDir() {
for _, pattern := range patterns {
if matched, err := filepath.Match(pattern, filepath.Base(path)); err != nil {
pathErrors = append(pathErrors, err)
} else if matched {
files = append(files, path)
}
}
}
return nil
})
return files, pathErrors
}