首页 > 后端开发 > C++ > 如何在复制前确保文件完成以防止'文件正在使用”错误?

如何在复制前确保文件完成以防止'文件正在使用”错误?

Mary-Kate Olsen
发布: 2025-01-04 16:41:39
原创
380 人浏览过

How to Ensure File Completion Before Copying to Prevent

复制前确保文件完成

在使用 FileSystemWatcher 检测目录中文件的创建并随后复制它们的场景中到不同的位置,当涉及大文件(> 10MB)时就会出现问题。由于复制过程在文件创建完成之前开始,可能会遇到“无法复制文件,因为它已被另一个进程使用”的错误。

解决方法:

唯一已知的解决方法是在启动复制操作之前检查文件是否被锁定。这可以通过一个函数来实现,该函数反复检查文件是否正在使用,直到返回 false,表示该文件不再被锁定。

方法 1(直接复制):

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;
}
登录后复制

方法二:

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;
}
登录后复制

以上是如何在复制前确保文件完成以防止'文件正在使用”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板