mirror of
https://github.com/duke-git/lancet.git
synced 2026-02-23 13:52:26 +08:00
fix: fix bug of CopyDir
This commit is contained in:
@@ -119,58 +119,43 @@ func CreateDir(absPath string) error {
|
|||||||
// if dstPath exists, it will return an error.
|
// if dstPath exists, it will return an error.
|
||||||
// Play: https://go.dev/play/p/YAyFTA_UuPb
|
// Play: https://go.dev/play/p/YAyFTA_UuPb
|
||||||
func CopyDir(srcPath string, dstPath string) error {
|
func CopyDir(srcPath string, dstPath string) error {
|
||||||
if !IsDir(srcPath) {
|
srcInfo, err := os.Stat(srcPath)
|
||||||
return errors.New("source path is not a directory")
|
|
||||||
}
|
|
||||||
var err error
|
|
||||||
srcPath, err = filepath.Abs(srcPath)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return fmt.Errorf("failed to get source directory info: %w", err)
|
||||||
}
|
|
||||||
if IsExist(dstPath) {
|
|
||||||
return errors.New("destination path already exists")
|
|
||||||
}
|
|
||||||
dstPath, err = filepath.Abs(dstPath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// get srcPath's file info
|
if !srcInfo.IsDir() {
|
||||||
srcFileInfo, err := os.Stat(srcPath)
|
return fmt.Errorf("source path is not a directory: %s", srcPath)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// create dstPath with srcPath's mode
|
err = os.MkdirAll(dstPath, 0755)
|
||||||
err = os.MkdirAll(dstPath, srcFileInfo.Mode())
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return fmt.Errorf("failed to create destination directory: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = filepath.Walk(srcPath, func(path string, info os.FileInfo, err error) error {
|
entries, err := os.ReadDir(srcPath)
|
||||||
if srcPath == path {
|
if err != nil {
|
||||||
return nil
|
return fmt.Errorf("failed to read source directory: %w", err)
|
||||||
}
|
}
|
||||||
curDstPath := filepath.Join(dstPath, filepath.Base(path))
|
|
||||||
if info.IsDir() {
|
for _, entry := range entries {
|
||||||
err = CopyDir(path, curDstPath)
|
srcDir := filepath.Join(srcPath, entry.Name())
|
||||||
|
dstDir := filepath.Join(dstPath, entry.Name())
|
||||||
|
|
||||||
|
if entry.IsDir() {
|
||||||
|
err := CopyDir(srcDir, dstDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
err = CopyFile(path, curDstPath)
|
err := CopyFile(srcDir, dstDir)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = os.Chmod(curDstPath, info.Mode())
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return err
|
}
|
||||||
})
|
|
||||||
|
|
||||||
return err
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsDir checks if the path is directory or not.
|
// IsDir checks if the path is directory or not.
|
||||||
|
|||||||
Reference in New Issue
Block a user