c#检查文件是打开还是被复制

时间:2015-06-03 07:51:01

标签: c# windows

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

我正在使用FileSystemWatcher跟踪文件夹上的文件更改,并将更改的文件复制到另一个文件夹。我不想复制文件,直到它被保存完毕。我无法找到适用于以下所有3种情况的解决方案:

1)新文件被复制到文件夹中 2)通过复制新文件覆盖现有文件 3)文件由另一个进程(即Word)打开 我从下面的线程中尝试过IsFileLocked方法。 c# check if file is open

它可以用于复制,但问题是对于打开的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;
}

您是否知道如何区分是由某个应用程序打开还是被复制?

0 个答案:

没有答案