github.com/pavlo67/common@v0.5.3/common/filelib/files.go (about)

     1  package filelib
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"io/fs"
     7  	"os"
     8  	"path"
     9  	"path/filepath"
    10  	"regexp"
    11  	"runtime"
    12  	"strings"
    13  	"time"
    14  
    15  	"github.com/pkg/errors"
    16  )
    17  
    18  func CurrentFile(removeExt bool) string {
    19  	if _, filename, _, ok := runtime.Caller(1); ok {
    20  		if removeExt {
    21  			filenamePOSIX := reBackslash.ReplaceAllString(filename, "/")
    22  			partes := strings.Split(filenamePOSIX, "/")
    23  			if len(partes) < 1 {
    24  				return ""
    25  			}
    26  			partes[len(partes)-1] = reExt.ReplaceAllString(partes[len(partes)-1], "")
    27  			return strings.Join(partes, "/")
    28  		}
    29  		return filename
    30  	}
    31  	return ""
    32  }
    33  
    34  func CorrectFileName(name string) string {
    35  	name = rePoint.ReplaceAllLiteralString(name, "_")
    36  	name = reSpecials.ReplaceAllLiteralString(name, "_")
    37  	return name
    38  }
    39  
    40  const onCopyFiles = "on filelib.CopyFiles()"
    41  
    42  func CopyFiles(path, targetPath string, reStr string, removeOrigin bool) error {
    43  	re, err := regexp.Compile(reStr)
    44  	if err != nil {
    45  		return fmt.Errorf("wrong reStr: '%s'"+onCopyFiles, reStr)
    46  	}
    47  
    48  	targetPath, err = Dir(targetPath)
    49  	if err != nil {
    50  		return fmt.Errorf("targetPath is wrong: %s / "+onCopyFiles, err)
    51  	}
    52  
    53  	dirEntries, err := List(path, re, false, true)
    54  	if err != nil {
    55  		return fmt.Errorf("%s / "+onCopyFiles, err)
    56  	}
    57  
    58  	for _, dirEntry := range dirEntries {
    59  		if removeOrigin {
    60  			err = os.Rename(dirEntry, filepath.Join(targetPath, filepath.Base(dirEntry)))
    61  		} else {
    62  			err = CopyFile(dirEntry, filepath.Join(targetPath, filepath.Base(dirEntry)))
    63  		}
    64  
    65  		if err != nil {
    66  			return fmt.Errorf("%s / "+onCopyFiles, err)
    67  		}
    68  
    69  	}
    70  
    71  	return nil
    72  }
    73  
    74  func BackupFile(fileName string) error {
    75  	dir := path.Dir(fileName) + "/"
    76  
    77  	backupName := dir + path.Base(fileName) + "." + time.Now().Format(time.RFC3339)[:10] + ".bak"
    78  
    79  	_, err := os.Stat(backupName)
    80  
    81  	if err == nil {
    82  		return nil
    83  	}
    84  
    85  	if os.IsNotExist(err) {
    86  		err = CopyFile(fileName, backupName)
    87  		return errors.Wrapf(err, "on copying '%s' to '%s'", fileName, backupName)
    88  	}
    89  
    90  	return errors.Wrapf(err, "on copying '%s' to '%s'", fileName, backupName)
    91  }
    92  
    93  type Convert func(data []byte) ([]byte, error)
    94  
    95  func CopyFileConverted(src, dst string, perm fs.FileMode, convert Convert) error {
    96  	// TODO??? check if src and dst are the same
    97  
    98  	data, err := os.ReadFile(src)
    99  	if err != nil {
   100  		return err
   101  	}
   102  
   103  	if convert != nil {
   104  		data, err = convert(data)
   105  		if err != nil {
   106  			return err
   107  		}
   108  	}
   109  
   110  	return os.WriteFile(dst, data, perm)
   111  }
   112  
   113  //func CopyFile(src, dst string) error {
   114  //	// TODO??? check if src and dst are the same
   115  //
   116  //	in, err := os.Open(src)
   117  //	if err != nil {
   118  //		return err
   119  //	}
   120  //	defer func() {
   121  //		if err := in.Close(); err != nil {
   122  //			fmt.Fprintf(os.Stderr, "error closing %s: %s", src, err)
   123  //		}
   124  //	}()
   125  //
   126  //	out, err := os.Create(dst)
   127  //	if err != nil {
   128  //		return err
   129  //	}
   130  //	defer func() {
   131  //		if err := out.Close(); err != nil {
   132  //			fmt.Fprintf(os.Stderr, "error closing %s: %s", dst, err)
   133  //		}
   134  //	}()
   135  //
   136  //	if _, err = io.Copy(out, in); err != nil {
   137  //		return err
   138  //	}
   139  //
   140  //	return out.Sync()
   141  //}
   142  
   143  //type Convert func(data []byte) ([]byte, error)
   144  //
   145  //func CopyFileConverted(src, dst string, perm fs.FileMode, convert Convert) error {
   146  //	// TODO??? check if src and dst are the same
   147  //
   148  //	data, err := os.ReadFile(src)
   149  //	if err != nil {
   150  //		return err
   151  //	}
   152  //
   153  //	if convert != nil {
   154  //		data, err = convert(data)
   155  //		if err != nil {
   156  //			return err
   157  //		}
   158  //	}
   159  //
   160  //	return os.WriteFile(dst, data, perm)
   161  //}
   162  
   163  func CopyFile(src, dst string) error {
   164  	// TODO??? check if src and dst are the same
   165  
   166  	in, err := os.Open(src)
   167  	if err != nil {
   168  		return err
   169  	}
   170  	defer func() {
   171  		if err := in.Close(); err != nil {
   172  			fmt.Fprintf(os.Stderr, "error closing %s: %s", src, err)
   173  		}
   174  	}()
   175  
   176  	out, err := os.Create(dst)
   177  	if err != nil {
   178  		return err
   179  	}
   180  	defer func() {
   181  		if err := out.Close(); err != nil {
   182  			fmt.Fprintf(os.Stderr, "error closing %s: %s", dst, err)
   183  		}
   184  	}()
   185  
   186  	if _, err = io.Copy(out, in); err != nil {
   187  		return err
   188  	}
   189  
   190  	return out.Sync()
   191  }
   192  
   193  func RemoveContents(dir string) error {
   194  	//d, err := os.Open(dir)
   195  	//if err != nil {
   196  	//	return err
   197  	//}
   198  	//defer d.Close()
   199  	//names, err := d.Readdirnames(-1)
   200  	//if err != nil {
   201  	//	return err
   202  	//}
   203  
   204  	files, err := os.ReadDir(dir)
   205  	if err != nil {
   206  		return err
   207  	}
   208  
   209  	for _, file := range files {
   210  		if err = os.RemoveAll(filepath.Join(dir, file.Name())); err != nil {
   211  			return err
   212  		}
   213  	}
   214  	return nil
   215  }
   216  
   217  const onRemoveFile = "on filelib.RemoveFile()"
   218  
   219  func RemoveFile(path string) error {
   220  	if fileExists, _ := FileExistsAny(path); fileExists {
   221  		if err := os.Remove(path); err != nil {
   222  			return errors.Wrap(err, onRemoveFile)
   223  		}
   224  	}
   225  	return nil
   226  }