12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- package main
- import (
- "fmt"
- "io"
- "os"
- "path/filepath"
- log "github.com/sirupsen/logrus"
- )
- /*help to copy the file, ioutil doesn't offer the feature*/
- func copyFileContents(src, dst string) (err error) {
- in, err := os.Open(src)
- if err != nil {
- return
- }
- defer in.Close()
- out, err := os.Create(dst)
- if err != nil {
- return
- }
- defer func() {
- cerr := out.Close()
- if err == nil {
- err = cerr
- }
- }()
- if _, err = io.Copy(out, in); err != nil {
- return
- }
- err = out.Sync()
- return
- }
- /*copy the file, ioutile doesn't offer the feature*/
- func CopyFile(sourceSymLink, destinationFile string) (err error) {
- sourceFile, err := filepath.EvalSymlinks(sourceSymLink)
- if err != nil {
- log.Infof("Not a symlink : %s", err)
- sourceFile = sourceSymLink
- }
- sourceFileStat, err := os.Stat(sourceFile)
- if err != nil {
- return
- }
- if !sourceFileStat.Mode().IsRegular() {
- // cannot copy non-regular files (e.g., directories,
- // symlinks, devices, etc.)
- return fmt.Errorf("copyFile: non-regular source file %s (%q)", sourceFileStat.Name(), sourceFileStat.Mode().String())
- }
- destinationFileStat, err := os.Stat(destinationFile)
- if err != nil {
- if !os.IsNotExist(err) {
- return
- }
- } else {
- if !(destinationFileStat.Mode().IsRegular()) {
- return fmt.Errorf("copyFile: non-regular destination file %s (%q)", destinationFileStat.Name(), destinationFileStat.Mode().String())
- }
- if os.SameFile(sourceFileStat, destinationFileStat) {
- return
- }
- }
- if err = os.Link(sourceFile, destinationFile); err != nil {
- err = copyFileContents(sourceFile, destinationFile)
- }
- return
- }
|