Saya menjalankan .bat yang mengandung:
robocopy \\server\directory\ .\localdir /MIR
Ini memindahkan satu file dari server ke direktori lokal saya.
Ini file yang besar dan akan membutuhkan waktu cukup lama untuk diselesaikan, namun saya dapat mencapai apa yang saya butuhkan dengan salinan file yang ada di lokasi itu.
Pada titik mana tepatnya file akan ditimpa? Bisakah saya menghapusnya dan menggunakan file yang ada di \ localdir sebelum .bat mulai berjalan? Atau apakah saya perlu menunggu robocopy selesai?
Jawaban:
robocopy
tidak berbeda dari program salin file lainnya. Salinan yang ditimpa "memotong" data yang ada dalam file dan kemudian mulai menulis data baru. Anda dapat mengamati ini dengan program yang memantau API sistem yang disebut oleh robocopy, seperti salah satu opsi yang tercantum di sini . Maka Anda hanya perlu mencari setiap panggilan API di MSDN untuk memahami apa yang sebenarnya terjadi.Pertama, ia memanggil SetFilePointerEx untuk mencari ke awal file (jika belum ada di sana). Kemudian ia memanggil SetEndOfFile untuk memotong file ke penanda BOF (menjadikannya file nol-byte). Ini semua terjadi begitu cepat sehingga efektif segera setelah perintah ini mulai dijalankan, data file asli Anda "hilang" untuk semua maksud dan tujuan (blok yang mewakili aliran data file akan segera ditimpa secara keseluruhan atau sebagian oleh NTFS di masa depan menulis perintah).
Jika Anda ingin melakukan ini "secara atom", Anda dapat melakukan operasi penggantian nama, seperti ini:
Salin konten file (menggunakan robocopy) dari server ke nama path unik pada sistem lokal Anda yang TIDAK ada saat ini (misalnya, jika file tersebut dinamai
foo
, Anda dapat menyalinnyafoo.bak
.)Lakukan penggantian nama overwriting menggunakan fungsi ganti nama atom Windows API yang ditambahkan pada Windows Vista (dan karena itu tidak didukung pada XP dan sebelumnya, yang memerlukan non-atomik, mungkin buggy atau rusak, non-atomik; ouch): MoveFileTransacted () . Dengan cara ini, Anda dapat "bertukar" data secara instan dalam file, dari konten file asli ke konten file baru. Ini berarti tidak mungkin bagi program mana pun untuk pernah membaca file yang sebagian-lengkap - baik itu membaca salinan asli (lengkap, tidak diubah), atau membaca salinan diperbarui lengkap, tidak diubah. Itu tidak akan pernah membaca salinan "tidak lengkap" atau kombinasi kacau dari kedua file.
Kelemahan dari metode alternatif ini adalah:
sumber