Menunggu Sehingga Fail Ditulis Sepenuhnya
Dalam senario tertentu, adalah penting untuk memastikan operasi penyalinan fail bermula hanya apabila fail sumber ditulis sepenuhnya. Malangnya, ini boleh mencabar apabila berurusan dengan fail besar, kerana percubaan menyalin pramatang boleh mengakibatkan ralat "Tidak dapat menyalin fail, kerana ia digunakan oleh proses lain".
Penyelesaian untuk Masalah
Walaupun tiada penyelesaian lengkap untuk isu ini, wujud penyelesaian yang melibatkan pemeriksaan secara berkala sama ada fail itu masih diubah suai sebelum memulakan proses penyalinan. Berikut ialah dua kaedah untuk menyelesaikan tugas ini:
Kaedah 1
private bool IsFileLocked(FileInfo file) { FileStream stream = null; try { stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); } catch (IOException) { return true; } finally { if (stream != null) stream.Close(); } return false; }
Kaedah ini cuba membuka fail untuk akses eksklusif dan mengembalikan benar jika fail dikunci (iaitu, masih ditulis atau diproses oleh urutan lain).
Kaedah 2
const int ERROR_SHARING_VIOLATION = 32; const int ERROR_LOCK_VIOLATION = 33; private bool IsFileLocked(string file) { if (File.Exists(file)) { FileStream stream = null; try { stream = File.Open(file, FileMode.Open, FileAccess.ReadWrite, FileShare.None); } catch (Exception ex2) { int errorCode = Marshal.GetHRForException(ex2) & ((1 << 16) - 1); if ((ex2 is IOException) && (errorCode == ERROR_SHARING_VIOLATION || errorCode == ERROR_LOCK_VIOLATION)) { return true; } } finally { if (stream != null) stream.Close(); } } return false; }
Kaedah ini menyemak kedua-dua kewujudan fail dan ketersediaannya untuk akses eksklusif, mengembalikan benar jika fail dikunci (iaitu, tidak boleh diakses kerana perkongsian atau pelanggaran kunci).
Atas ialah kandungan terperinci Bagaimana Saya Boleh Memastikan Fail Ditulis Sepenuhnya Sebelum Menyalinnya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!