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

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

Linda Hamilton
Linda Hamilton原創
2025-01-05 12:07:41424瀏覽

How to Ensure a File Is Completely Written Before Copying It?

等待檔案完全寫入

在監視目錄中建立檔案時,常見任務是將其複製到不同的目錄地點。但是,由於在複製過程開始之前文件未完全寫入,因此大檔案傳輸可能會導致失敗。

要解決此問題,解決方法是在複製之前檢查文件的狀態。一種方法是使用 IsFileLocked 函數,如果檔案仍在由另一個執行緒寫入或處理,則該函數傳回 True。下面是一個示例:

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

此代碼可以合併到您的 FileSystemWatcher_Created 事件處理程序中:

public static void listener_Created(object sender, FileSystemEventArgs e)
{
    while (IsFileLocked(new FileInfo(e.FullPath)))
    {
        // Wait for file to finish writing
    }

    File.Copy(e.FullPath, @"D:\levan\FolderListenerTest\CopiedFilesFolder\" + e.Name);
}

或者,您可以使用以下方法:

const int ERROR_SHARING_VIOLATION = 32;
const int ERROR_LOCK_VIOLATION = 33;
private bool IsFileLocked(string file)
{
    if (File.Exists(file) == true)
    {
        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;
}

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

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