Logo

Programming-Idioms

  • C++
  • Java

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 "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).
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 java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
Files.copy(Path.of(src), Path.of(dst));
with Ada.Directories;
Ada.Directories.Copy_File (Source_Name => Src,
                           Target_Name => Dst);

New implementation...