C# 检查文件是否已打开或正在复制

C# 检查文件是否已打开或正在复制,c#,windows,C#,Windows,我有一个让我发疯的问题。也许你能帮忙;) 我正在使用FileSystemWatcher跟踪文件夹中的文件更改,并将更改的文件复制到另一个文件夹。在保存文件之前,我不想复制该文件。我无法找到同时适用于以下所有3种情况的解决方案: 1) 正在将新文件复制到文件夹中 2) 正在通过复制新文件覆盖现有文件 3) 文件由另一个进程(即Word)打开 我从下面的线程中尝试了IsFileLocked方法。 它可以用于复制,但问题是,对于打开的OFFICE文件,该函数将始终返回TRUE(可能对于其他一些文件也

我有一个让我发疯的问题。也许你能帮忙;)

我正在使用FileSystemWatcher跟踪文件夹中的文件更改,并将更改的文件复制到另一个文件夹。在保存文件之前,我不想复制该文件。我无法找到同时适用于以下所有3种情况的解决方案:

1) 正在将新文件复制到文件夹中 2) 正在通过复制新文件覆盖现有文件 3) 文件由另一个进程(即Word)打开 我从下面的线程中尝试了IsFileLocked方法。

它可以用于复制,但问题是,对于打开的OFFICE文件,该函数将始终返回TRUE(可能对于其他一些文件也是如此)

我还尝试在循环中检查文件大小是否更改,但这似乎是不可能的,因为FileInfo.Length始终返回目标大小(即使文件仍在复制)

我正在使用该函数检查文件是否正在使用

public static bool IsFileLocked(string path)
{
    FileInfo fileInfo = new FileInfo(path);
    FileStream stream = null;

    try
    {
        stream = fileInfo.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
    }
    catch (UnauthorizedAccessException)
    {
        // file created with readonly flag
        return false;
    }
    catch (FileNotFoundException)
    {
        return false;
    }
    catch (IOException ex)
    {
        int errorCode = Marshal.GetHRForException(ex) & ((1 << 16) - 1);
        bool islocked = errorCode == ERROR_SHARING_VIOLATION || errorCode == ERROR_LOCK_VIOLATION;
        return islocked;
    }
    finally
    {
        if (stream != null)
        {
            stream.Close();
            stream.Dispose();
        }
    }
    //file is not locked
    return false;
}
公共静态bool IsFileLocked(字符串路径)
{
FileInfo FileInfo=新的FileInfo(路径);
FileStream=null;
尝试
{
stream=fileInfo.Open(FileMode.Open、FileAccess.ReadWrite、FileShare.None);
}
捕获(未经授权的访问例外)
{
//使用只读标志创建的文件
返回false;
}
捕获(FileNotFoundException)
{
返回false;
}
捕获(IOEX异常)
{

int errorCode=Marshal.GetHRForException(ex)和((1)您是否打开该文件进行独占读取?请查看我更新的问题您可能希望在锁定该文件进行独占读取时更改复制该文件的逻辑-否则另一个过程可能会在您检查该文件是否已锁定和完成处理之间对其进行修改。Rowland您能解释一下您的意思吗?问题是,在我将文件复制到另一个folder2之前,我必须跟踪用户是否通过Windows资源管理器、Total Commander等处理文件,或者他或她是否通过例如Office on folder1保存文件。我希望确保我复制的是完整文件,而不是部分文件。目前,您有一种方法可以查看该文件是否正在使用。这是实际的ly获取一个读取流,如果它在别处未被使用,但您不使用它,而是在检查完成后再次尝试对该文件执行“操作”;此时为“其他操作”可能已跳入并开始读取该文件。相反,您可以在知道该文件处于良好读取状态时使用该流进行处理。是否打开该文件进行独占读取?请查看我的更新问题您可能希望在锁定该文件的同时更改逻辑以复制该文件独占读取-否则另一个进程可能会在您检查文件是否已锁定和完成处理之间对其进行修改。罗兰,您能解释一下您的意思吗?问题是,我必须跟踪用户是否已通过Windows资源管理器、Total Commander等处理完文件,或者是否已通过例如folder1上的Office完成保存重新将该文件复制到另一个文件夹2。我希望确保复制完整文件,而不仅仅是其中的一部分。目前,您有一种方法可以查看该文件是否正在使用。如果该文件在其他地方未被使用,它实际上会获得一个读取流,但您不使用它,而是在检查完成后再次尝试对该文件执行“操作”;此时“还有别的吗"可能已跳入并开始读取该文件。相反,您可以在知道该文件处于良好读取状态时使用该流进行处理。是否打开该文件进行独占读取?请查看我的更新问题您可能希望在锁定该文件的同时更改逻辑以复制该文件独占读取-否则另一个进程可能会在您检查文件是否已锁定和完成处理之间对其进行修改。罗兰,您能解释一下您的意思吗?问题是,我必须跟踪用户是否已通过Windows资源管理器、Total Commander等处理完文件,或者是否已通过例如folder1上的Office完成保存重新将该文件复制到另一个文件夹2。我希望确保复制完整文件,而不仅仅是其中的一部分。目前,您有一种方法可以查看该文件是否正在使用。如果该文件在其他地方未被使用,它实际上会获得一个读取流,但您不使用它,而是在检查完成后再次尝试对该文件执行“操作”;此时“其他东西”可能已经跳入并开始读取该文件。相反,您可以在知道该文件处于良好的读取状态时,实际使用该流进行处理。