C# 当另一个进程正在使用文件时复制该文件

C# 当另一个进程正在使用文件时复制该文件,c#,C#,我试图编写一个程序来监视一个文件夹,当文件夹中的任何文件被更改/更新时,它必须将该文件复制到另一个文件夹。我特别想用这个程序来复制dll文件。每当我使用VS构建项目时,就会创建dll,然后我希望我的程序将新生成的dll复制到另一个文件夹中 问题是,当我尝试复制文件时,我得到一个异常,该进程无法访问该文件,因为它正被另一个进程使用。我知道这个异常意味着什么,我也看到了关于如何修复它的答案(但在大多数情况下,答案都假设开发人员也可以控制其他进程)。在我的例子中,我无法控制使用该文件的其他进程(可能是

我试图编写一个程序来监视一个文件夹,当文件夹中的任何文件被更改/更新时,它必须将该文件复制到另一个文件夹。我特别想用这个程序来复制dll文件。每当我使用VS构建项目时,就会创建dll,然后我希望我的程序将新生成的dll复制到另一个文件夹中

问题是,当我尝试复制文件时,我得到一个异常,该进程无法访问该文件,因为它正被另一个进程使用。我知道这个异常意味着什么,我也看到了关于如何修复它的答案(但在大多数情况下,答案都假设开发人员也可以控制其他进程)。在我的例子中,我无法控制使用该文件的其他进程(可能是VS?)

甚至有可能做到这一点吗?如果没有,那么为什么我可以手动将该dll复制到另一个文件夹,但不能以编程方式进行复制呢。这是我用来复制文件的代码

private void CopyFile(object sender, FileSystemEventArgs e)
{
    string fileName = e.FullPath;
    try
    {
        System.Threading.Thread.Sleep(5000);
        File.Copy(fileName, System.IO.Path.Combine(DestinationFolderPath, fileName), true);
        this.Dispatcher.Invoke(() =>
        {
            Log.Text += "Copied " + e.Name + Environment.NewLine;
        });
    }
    catch (IOException exception)
    {
        this.Dispatcher.Invoke(() =>
        {
            Log.Text += "Error copying file " + e.Name + " " + exception.Message + Environment.NewLine;
        });
    }
}

您应该激活DLL的卷影复制。请在此处阅读更多信息:

本质上,当您启用卷影复制(通过将ShadowCopyFiles属性设置为字符串值“true”)时,应用程序路径中的所有程序集都将在加载之前复制到下载缓存中。然后可以从缓存文件夹复制程序集——这些程序集不会被锁定


这有帮助吗?

您应该激活DLL的卷影复制。请在此处阅读更多信息:

本质上,当您启用卷影复制(通过将ShadowCopyFiles属性设置为字符串值“true”)时,应用程序路径中的所有程序集都将在加载之前复制到下载缓存中。然后可以从缓存文件夹复制程序集——这些程序集不会被锁定


这有帮助吗?

你可以更微妙一些;与使用File.Copy helper方法不同,您可以尝试使用允许打开多个读取流的share参数来打开文件流以进行显式读取。如果文件未打开以供写入(并且DLL可能不会打开以供写入,除非它被禁用,在这种情况下,复制它将是无意义的),则允许您复制由另一个进程打开的文件


您可以阅读有关如何使用
FileStream的文档。打开
使用标志
FileAccess将文件内容复制到另一个文件(目标)。阅读
文件共享。读写

您可以更微妙一些;与使用File.Copy helper方法不同,您可以尝试使用允许打开多个读取流的share参数来打开文件流以进行显式读取。如果文件未打开以供写入(并且DLL可能不会打开以供写入,除非它被禁用,在这种情况下,复制它将是无意义的),则允许您复制由另一个进程打开的文件


您可以阅读有关如何使用
FileStream.Open
的文档,使用标志
FileAccess将文件内容复制到另一个文件(目标)。read
FileShare.ReadWrite

如果文件是由另一个应用程序以独占方式打开的,您几乎无法了解它,除了使用有点复杂的磁盘卷影副本,它可能不会返回文件的最新版本

假设您不是在创建备份应用程序,而是在创建某种工具。如果您可能希望创建正在监视的文件的其他应用程序在合理的时间内变得可用,那么您所需要做的就是保留一个失败应对操作的列表,并在稍有延迟后重试


如果您是为某个应用程序(例如VS)执行此操作,则最好使用可以找到项目设置的生成后事件。对于其他应用程序,您可以监视退出代码或其他内容,以找到它完成文件处理的时刻,这样您就可以自由地复制它们。

如果一个文件是由另一个应用程序独占打开的,您几乎无法了解它,除了使用有点复杂的磁盘卷影副本,它可能不会返回文件的最新版本

假设您不是在创建备份应用程序,而是在创建某种工具。如果您可能希望创建正在监视的文件的其他应用程序在合理的时间内变得可用,那么您所需要做的就是保留一个失败应对操作的列表,并在稍有延迟后重试


如果您是为某个应用程序(例如VS)执行此操作,则最好使用可以找到项目设置的生成后事件。对于其他应用程序,您可以监视退出代码或其他内容,以找到它完成文件处理的时间,这样您就可以自由复制它们。

复制?看@NovaSysEng,我看到了那条线索。我认为这里的答案假设开发人员可以控制这两个过程,就像我在问题中提到的那样。我显然无法控制其他进程。您是否尝试捕获该异常并在延迟后重试?很有可能进程只在一小段时间内持有锁。重复?看@NovaSysEng,我看到了那条线索。我认为这里的答案假设开发人员可以控制这两个过程,就像我在问题中提到的那样。我显然无法控制其他进程。您是否尝试捕获该异常并在延迟后重试?进程很可能只在很短的时间内持有锁。