首页 > 解决方案 > 当文件被另一个进程使用时复制文件

问题描述

我正在尝试编写一个监视文件夹的程序,当文件夹中的任何文件被更改/更新时,它必须将该文件复制到另一个文件夹。特别是我想用这个程序来复制 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;
        });
    }
}

标签: c#

解决方案


您应该激活 DLL 的卷影复制。在此处阅读更多信息:https ://docs.microsoft.com/en-us/dotnet/framework/app-domains/shadow-copy-assemblies

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

这有帮助吗?


推荐阅读