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
Lepaskan: 2025-01-04 16:41:39
asal
386 orang telah melayarinya

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;
}
Salin selepas log masuk

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;
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan