Logo

Programming-Idioms

This language bar is your friend. Select your favorite languages!
  • Go

Idiom #228 Copy a file

Copy the file at path src to dst.

import "os"
func copy(dst, src string) error {
	data, err := os.ReadFile(src)
	if err != nil {
		return err
	}
	stat, err := os.Stat(src)
	if err != nil {
		return err
	}
	return os.WriteFile(dst, data, stat.Mode())
}

This is fine if the file is small enough to fit in memory.
Warning: in Unix, the destination file's mode and permission bits may be different from the source file's, because umask is applied.
import "io"
import "os"
func copy(dst, src string) error {
	f, err := os.Open(src)
	if err != nil {
		return err
	}
	defer f.Close()
	stat, err := f.Stat()
	if err != nil {
		return err
	}
	g, err := os.OpenFile(dst, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, stat.Mode())
	if err != nil {
		return err
	}
	defer g.Close()
	_, err = io.Copy(g, f)
	if err != nil {
		return err
	}
	return os.Chmod(dst, stat.Mode())
}

This can handle large files.
import "os"
func copy(dst, src string) error {
	data, err := os.ReadFile(src)
	if err != nil {
		return err
	}
	stat, err := os.Stat(src)
	if err != nil {
		return err
	}
	err = os.WriteFile(dst, data, stat.Mode())
	if err != nil {
		return err
	}
	return os.Chmod(dst, stat.Mode())
}

This is fine if the file is small enough to fit in memory.
This preserves the source file's mode and permission bits (overriding umask in Unix).
with Ada.Directories;
Ada.Directories.Copy_File (Source_Name => Src,
                           Target_Name => Dst);

New implementation...