Memastikan Fail Siap Sebelum Menyalin
Dalam senario di mana FileSystemWatcher digunakan untuk mengesan penciptaan fail dalam direktori dan seterusnya menyalinnya ke lokasi yang berbeza, isu timbul apabila fail besar (>10MB) terlibat. Ralat "Tidak boleh menyalin fail, kerana ia digunakan oleh proses lain" mungkin dihadapi kerana proses penyalinan bermula sebelum penciptaan fail selesai.
Penyelesaian:
Satu-satunya penyelesaian yang diketahui melibatkan pemeriksaan sama ada fail dikunci sebelum memulakan operasi penyalinan. Ini boleh dicapai melalui fungsi yang berulang kali menyemak sama ada fail sedang digunakan sehingga ia mengembalikan palsu, menunjukkan bahawa fail tidak lagi dikunci.
Kaedah 1 (Salinan Terus):
private bool IsFileLocked(FileInfo file) { FileStream stream = null; try { stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); } catch (IOException) { // File still being written, processed, or doesn't exist return true; } finally { if (stream != null) stream.Close(); } // File not locked return false; }
Kaedah 2:
const int ERROR_SHARING_VIOLATION = 32; const int ERROR_LOCK_VIOLATION = 33; private bool IsFileLocked(string file) { // Check destination file status 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; }
Atas ialah kandungan terperinci Bagaimana untuk Memastikan Fail Selesai Sebelum Menyalin untuk Mencegah Ralat 'Fail Dalam Penggunaan'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!