Pada titik apa Robocopy menimpa file?


1

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?


Ada alasan untuk downvote? Apakah ada pertanyaan yang ada yang tidak dapat saya temukan atau apa pun di dokumen?
StuperUser

Jawaban:


1

robocopytidak 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:

  1. 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 menyalinnya foo.bak.)

  2. 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:

  • Saya tidak tahu program yang sudah melakukan ini di luar kotak;
  • Karena Anda memiliki file asli masih ada saat Anda sedang menyalin, Anda perlu penyimpanan dua kali lebih banyak. Jadi jika Anda berniat untuk menimpa file 1 GiB dengan file 1 GiB lainnya, Anda memerlukan total 2 GiB penyimpanan di sistem lokal Anda, meskipun untuk sementara.
  • Ini hanya berfungsi dengan NTFS Transaksional. Itu berarti jika sistem file sumber Anda atau sistem file tujuan untuk transaksional overwrite bukan NTFS, itu tidak akan berfungsi. Anda masih dapat menyalin file dari berbagi jaringan ke sistem lokal Anda, tetapi penggantian nama atom tidak akan berfungsi pada jaringan berbagi, atau (kecuali jika mereka menambahkannya di masa depan) pada ReFS, yang suatu hari nanti bisa menjadi sistem file standar kami seperti NTFS melakukannya lebih dari FAT32 tahun yang lalu.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.