c# - 当文件被另一个进程使用时复制文件
问题描述
我正在尝试编写一个监视文件夹的程序,当文件夹中的任何文件被更改/更新时,它必须将该文件复制到另一个文件夹。特别是我想用这个程序来复制 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 的卷影复制。在此处阅读更多信息:https ://docs.microsoft.com/en-us/dotnet/framework/app-domains/shadow-copy-assemblies
本质上,当您启用卷影复制(通过将 ShadowCopyFiles 属性设置为字符串值“true”)时,应用程序路径中的所有程序集在加载之前都将被复制到下载缓存中。然后,您可以从缓存文件夹中复制程序集——这些程序集不会被锁定。
这有帮助吗?