首页 >后端开发 >C++ >复制前如何确保文件已完全写入?

复制前如何确保文件已完全写入?

Linda Hamilton
Linda Hamilton原创
2025-01-05 12:07:41390浏览

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