Crates.io | clone-file |
lib.rs | clone-file |
version | 0.1.0 |
source | src |
created_at | 2023-04-02 16:02:18.4398 |
updated_at | 2023-04-02 16:02:18.4398 |
description | functions to clone files and file ranges with as little overhead as possible |
homepage | |
repository | https://github.com/iliazeus/clone-file |
max_upload_size | |
id | 828206 |
size | 12,766 |
A simple way to use your filesystem's reflink features.
// Clone a file using a reflink, or error if it can not be done.
clone_file("src.bin", "dest.bin");
// Try to clone a file, falling back to a regular copy.
clone_or_copy_file("src.bin", "dest.bin");
// Clone a sub-range of a file using a reflink, or error if it can not be done.
clone_file_range(
"src.bin",
/* offset: */ 4 << 10,
/* length: */ 2 << 20,
"dest.bin",
/* dest offset: */ 0
);
// Try to clone a sub-range of a file, falling back to a naive copy.
clone_or_copy_file_range(
"src.bin",
/* offset: */ 4 << 10,
/* length: */ 2 << 20,
"dest.bin",
/* dest offset: */ 0
);
On Linux, FICLONE
and FICLONERANGE
ioctls are used. Please refer to man 2 ioctl_ficlonerange
for details and limitations.
Tested with the btrfs
filesystem.
The clone_file
and clone_file_range
functions are currently not implemented for other platforms.
However, the fallback functions clone_or_copy_file
and clone_or_copy_file_range
will work, falling back to naive copies.
To test the cloning, we need a filesystem that supports reflinks. This requires a bit of a setup, which is implemented in the test.sh
script.
It expects a Linux system, with a btrfs-progs
packages installed. It creates a 200MiB loopback device, formats it into btrfs
, then creates the neccessary test data and runs cargo tests
. It then cleans up the loopback and the mount.
The tests are intentionally set up to run only through test.sh