Jika lokasi asli dan baru untuk file berada di sistem file yang sama, maka "pemindahan" secara konseptual identik dengan "ganti nama".
#include <stdio.h>
int rename (const char *oldname, const char *newname)
Cara biasa untuk memindahkan file di C adalah dengan menggunakan rename(2), yang terkadang gagal.
Jika Anda tidak dapat menggunakan syscall rename(2) (misalnya karena sumber dan target berada pada sistem file yang berbeda), Anda harus menanyakan ukuran, izin, dan metadata lain dari file sumber dengan stat(2); salin perulangan data pada read(2), write(2) (menggunakan buffer beberapa kilobyte), open(2), close(2) dan metadata menggunakan chmod(2), chown(2), utime(2) . Anda mungkin juga ingin menyalin atribut menggunakan getxattr(2), setxattr(2), listxattr(2). Dalam beberapa kasus, Anda juga dapat menggunakan sendfile(2), seperti yang dikomentari oleh David C. Rankin.
Dan jika sumber dan target berada pada sistem file yang berbeda, tidak ada cara untuk membuat pemindahan menjadi atomik dan menghindari kondisi balapan (Jadi menggunakan rename(2) lebih disukai jika memungkinkan, karena ini bersifat atomik menurut halaman manualnya). File sumber selalu dapat dimodifikasi (oleh proses lain) selama operasi pemindahan...
Jadi cara praktis untuk memindahkan file adalah dengan terlebih dahulu mencoba melakukan rename(2), dan jika gagal dengan EXDEV
(ketika jalur lama dan jalur baru tidak berada pada sistem file terpasang yang sama), maka Anda perlu menyalin byte dan metadata. Beberapa perpustakaan menyediakan fungsi untuk melakukan itu, mis. Qt QFile::ganti nama.
Baca Pemrograman Linux Tingkat Lanjut - dan lihat syscalls(2) - untuk informasi lebih lanjut (dan juga coba strace
beberapa mv
perintah untuk memahami apa yang dilakukannya). Buku itu dapat diunduh secara gratis dan legal (sehingga Anda dapat menemukan beberapa salinan di Web).
/bin/mv
perintah (lihat mv(1)) adalah bagian dari coreutils GNU yang merupakan perangkat lunak bebas. Anda dapat mempelajari kode sumbernya, atau menggunakan strace(1) untuk memahami apa yang dilakukan perintah tersebut (dalam istilah syscalls(2)). Di beberapa shell Unix open source seperti selempang atau busybox, mv
mungkin merupakan shell bawaan. Lihat juga path_resolution(7) dan glob(7).
Ada kasus sudut halus (bayangkan proses atau pthread lain melakukan beberapa operasi file pada sistem file, direktori, atau file yang sama). Baca beberapa buku teks sistem operasi untuk lebih lanjut.
Menggunakan campuran snprintf(3), system(3), mv(1) bisa menjadi rumit jika nama file berisi karakter aneh seperti tab atau
atau baris baru, atau dimulai dengan -
awal . Lihat errno(3).