Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Memastikan Fail Selesai Sebelum Menyalin untuk Mencegah Ralat 'Fail Dalam Penggunaan'?

Bagaimana untuk Memastikan Fail Selesai Sebelum Menyalin untuk Mencegah Ralat 'Fail Dalam Penggunaan'?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-04 16:41:39428semak imbas

How to Ensure File Completion Before Copying to Prevent

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn