首頁 >後端開發 >C++ >複製前如何確保文件已完全寫入?

複製前如何確保文件已完全寫入?

Patricia Arquette
Patricia Arquette原創
2025-01-03 17:45:43644瀏覽

How Can I Ensure a File Is Fully Written Before Copying It?

等待檔案完全寫入

在某些場景下,確保僅在來源檔案開始時才開始檔案複製操作至關重要完全寫好了。不幸的是,在處理大文件時,這可能具有挑戰性,因為過早的複製嘗試可能會導致可怕的「無法複製文件,因為它已被另一個進程使用」錯誤。

問題的解決方案

雖然此問題沒有完整的解決方案,但存在一種解決方法,其中包括在啟動複製之前定期檢查文件是否仍在修改過程。以下是完成此任務的兩種方法:

方法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;
}

此方法嘗試打開文件以進行獨佔訪問,如果文件被鎖定,則返回true (即仍在由另一個執行緒寫入或處理)。

方法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;
}

此方法檢查檔案是否存在及其獨佔存取的可用性,如果檔案被鎖定(即由於共用或鎖定衝突而無法存取),則傳回true。

以上是複製前如何確保文件已完全寫入?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn