package copy
import "github.com/otiai10/copy"
Index ¶
- func Copy(src, dest string, opts ...Options) error
- func TestOptions_OnSymlink(t *testing.T)
- type DirExistsAction
- type Options
- type PermissionControlFunc
- type SymlinkAction
Examples ¶
Functions ¶
func Copy ¶
Copy copies src to dest, doesn't matter if src is a directory or a file.
Code:
Output:Example¶
{
err := Copy("test/data/example", "test/data.copy/example")
fmt.Println("Error:", err)
info, _ := os.Stat("test/data.copy/example")
fmt.Println("IsDir:", info.IsDir())
// Output:
// Error: <nil>
// IsDir: true
}
Error: <nil>
IsDir: true
func TestOptions_OnSymlink ¶
Types ¶
type DirExistsAction ¶
type DirExistsAction int
DirExistsAction represents what to do on dest dir.
const ( // Merge preserves or overwrites existing files under the dir (default behavior). Merge DirExistsAction = iota // Replace deletes all contents under the dir and copy src files. Replace // Untouchable does nothing for the dir, and leaves it as it is. Untouchable )
type Options ¶
type Options struct { // OnSymlink can specify what to do on symlink OnSymlink func(src string) SymlinkAction // OnDirExists can specify what to do when there is a directory already existing in destination. OnDirExists func(src, dest string) DirExistsAction // OnErr lets called decide whether or not to continue on particular copy error. OnError func(src, dest string, err error) error // Skip can specify which files should be skipped Skip func(srcinfo os.FileInfo, src, dest string) (bool, error) // RenameDestination can specify the destination file or dir name if needed to rename. RenameDestination func(src, dest string) (string, error) // Specials includes special files to be copied. default false. Specials bool // AddPermission to every entities, // NO MORE THAN 0777 // @OBSOLETE // Use `PermissionControl = AddPermission(perm)` instead AddPermission os.FileMode // PermissionControl can preserve or even add permission to // every entries, for example // // opt.PermissionControl = AddPermission(0222) // // See permission_control.go for more detail. PermissionControl PermissionControlFunc // Sync file after copy. // Useful in case when file must be on the disk // (in case crash happens, for example), // at the expense of some performance penalty Sync bool // Preserve the atime and the mtime of the entries. // On linux we can preserve only up to 1 millisecond accuracy. PreserveTimes bool // Preserve the uid and the gid of all entries. PreserveOwner bool // The byte size of the buffer to use for copying files. // If zero, the internal default buffer of 32KB is used. // See https://golang.org/pkg/io/#CopyBuffer for more information. CopyBufferSize uint // If you want to add some limitation on reading src file, // you can wrap the src and provide new reader, // such as `RateLimitReader` in the test case. WrapReader func(src io.Reader) io.Reader // If given, copy.Copy refers to this fs.FS instead of the OS filesystem. // e.g., You can use embed.FS to copy files from embedded filesystem. FS fs.FS // NumOfWorkers represents the number of workers used for // concurrent copying contents of directories. // If 0 or 1, it does not use goroutine for copying directories. // Please refer to https://pkg.go.dev/golang.org/x/sync/semaphore for more details. NumOfWorkers int64 // PreferConcurrent is a function to determine whether or not // to use goroutine for copying contents of directories. // If PreferConcurrent is nil, which is default, it does concurrent // copying for all directories. // If NumOfWorkers is 0 or 1, this function will be ignored. PreferConcurrent func(srcdir, destdir string) (bool, error) // contains filtered or unexported fields }
Options specifies optional actions on copying.
Code:
Output:Example¶
{
err := Copy(
"test/data/example",
"test/data.copy/example_with_options",
Options{
Skip: func(info os.FileInfo, src, dest string) (bool, error) {
return strings.HasSuffix(src, ".git-like"), nil
},
OnSymlink: func(src string) SymlinkAction {
return Skip
},
PermissionControl: AddPermission(0200),
},
)
fmt.Println("Error:", err)
_, err = os.Stat("test/data.copy/example_with_options/.git-like")
fmt.Println("Skipped:", os.IsNotExist(err))
// Output:
// Error: <nil>
// Skipped: true
}
Error: <nil>
Skipped: true
type PermissionControlFunc ¶
type PermissionControlFunc func(srcinfo fs.FileInfo, dest string) (chmodfunc func(*error), err error)
var ( AddPermission = func(perm os.FileMode) PermissionControlFunc { return func(srcinfo fs.FileInfo, dest string) (func(*error), error) { orig := srcinfo.Mode() if srcinfo.IsDir() { if err := os.MkdirAll(dest, tmpPermissionForDirectory); err != nil { return func(*error) {}, err } } return func(err *error) { chmod(dest, orig|perm, err) }, nil } } PerservePermission PermissionControlFunc = AddPermission(0) DoNothing PermissionControlFunc = func(srcinfo fs.FileInfo, dest string) (func(*error), error) { if srcinfo.IsDir() { if err := os.MkdirAll(dest, srcinfo.Mode()); err != nil { return func(*error) {}, err } } return func(*error) {}, nil } )
type SymlinkAction ¶
type SymlinkAction int
SymlinkAction represents what to do on symlink.
const ( // Deep creates hard-copy of contents. Deep SymlinkAction = iota // Shallow creates new symlink to the dest of symlink. Shallow // Skip does nothing with symlink. Skip )
Source Files ¶
copy.go copy_namedpipes_x.go options.go permission_control.go preserve_ltimes_x.go preserve_owner.go preserve_times.go stat_times_js.go symlink_test_x.go
- Version
- v1.14.1 (latest)
- Published
- Jan 5, 2025
- Platform
- js/wasm
- Imports
- 11 packages
- Last checked
- 1 week ago –
Tools for package owners.