github.com/jmigpin/editor@v1.6.0/util/iout/mkdirwritecopy.go (about)

     1  package iout
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"io/ioutil"
     7  	"os"
     8  	"path/filepath"
     9  )
    10  
    11  var MkdirMode os.FileMode = 0770
    12  
    13  func MkdirAll(filename string) error {
    14  	return os.MkdirAll(filename, MkdirMode)
    15  }
    16  
    17  func MkdirAllWriteFile(filename string, src []byte, m os.FileMode) error {
    18  	if err := MkdirAll(filepath.Dir(filename)); err != nil {
    19  		return err
    20  	}
    21  	return ioutil.WriteFile(filename, []byte(src), m)
    22  }
    23  
    24  func MkdirAllCopyFile(src, dst string, m os.FileMode) error {
    25  	if err := MkdirAll(filepath.Dir(dst)); err != nil {
    26  		return err
    27  	}
    28  	return CopyFile(src, dst, m)
    29  }
    30  
    31  func CopyFile(src, dst string, m os.FileMode) error {
    32  	from, err := os.Open(src)
    33  	if err != nil {
    34  		return err
    35  	}
    36  	defer from.Close()
    37  	flags := os.O_RDWR | os.O_CREATE | os.O_TRUNC
    38  	to, err := os.OpenFile(dst, flags, m)
    39  	if err != nil {
    40  		return err
    41  	}
    42  	defer to.Close()
    43  	_, err = io.Copy(to, from)
    44  	return err
    45  }
    46  
    47  func MkdirAllCopyFileSync(src, dst string, m os.FileMode) error {
    48  	// must exist in src
    49  	info1, err := os.Stat(src)
    50  	if os.IsNotExist(err) {
    51  		return fmt.Errorf("src not found: %v", src)
    52  	}
    53  
    54  	// already exists in dest with same modification time
    55  	info2, err := os.Stat(dst)
    56  	if !os.IsNotExist(err) {
    57  		// compare modification time in src
    58  		if info2.ModTime().Equal(info1.ModTime()) {
    59  			return nil
    60  		}
    61  	}
    62  
    63  	if err := MkdirAllCopyFile(src, dst, m); err != nil {
    64  		return err
    65  	}
    66  
    67  	// set modtime equal to src to avoid copy next time
    68  	t := info1.ModTime().Local()
    69  	return os.Chtimes(dst, t, t)
    70  }