C# 从UNC路径复制正在执行的文件

C# 从UNC路径复制正在执行的文件,c#,.net,file,process,io,C#,.net,File,Process,Io,我正在编写一个应用程序,它需要从当前正在执行文件的网络目录复制文件 我已尝试使用打开文件 using (var source = new FileStream(fileData.FileName, FileMode.Open, FileAccess.Read, FileShare.R

我正在编写一个应用程序,它需要从当前正在执行文件的网络目录复制文件

我已尝试使用打开文件

using (var source = new FileStream(fileData.FileName, 
                                   FileMode.Open, 
                                   FileAccess.Read, 
                                   FileShare.ReadWrite))
打开文件流后,我创建另一个要复制到的流

但是,这会引发一个异常,表示该文件正由另一个进程使用。我不知道如何避开这个问题。如果我只使用文件资源管理器,它可以很好地复制文件。所以我知道这是可能的,只是不知道如何

编辑:
我还尝试了简单的
文件.Copy(源、目标)
,我得到了相同的异常,表示该文件正被另一个进程使用。

要复制另一个进程正在使用的文件,我们必须使用Windows中的两个服务,您需要验证这些服务是否未被禁用:

  • 卷影复制
  • Microsoft软件卷影复制提供程序
它们可以作为手动启动,因此不需要一直运行

为此,我们可以使用任何第三方工具Hobocopy就是其中之一。它将在需要时自动启动这两个服务,卷影复制服务完成后将关闭

下载链接:

解压文件并将其放入项目的Lib目录中。然后使用System.Diagnostics.process调用该进程。在您的情况下,只需使用以下开关作为参数:/y(不提示,只需复制所有内容)

命令行语法:

hobocopy [/statefile=FILE] [/verbosity=LEVEL] [ /full | /incremental ]
     [ /clear ] [ /skipdenied ] [ /y ] [ /simulate ] [/recursive]
     src dest [file [file [ ... ] ]
C#代码:

Process流程=新流程();
process.StartInfo.UseShellExecute=false;
process.StartInfo.CreateNoWindow=true;
process.StartInfo.FileName=@“Lib\hobocopy.exe”;
process.StartInfo.Arguments=@“/y”;
process.Start();

这将把正在使用或未使用的任何文件(hobocopy主要关注高效地复制目录)复制到您的目标。

卷影复制服务可能会帮助您:网络文件服务器和客户端运行的是什么操作系统,您需要在任一侧支持任何其他操作系统版本吗?我要求在Windows 2012上提供as,这将是一个很好的解决方案。该设置是在所有计算机上使用Windows Server 2008的同质服务设置。
Process process = new Process();
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.FileName = @"Lib\hobocopy.exe";
process.StartInfo.Arguments = @" /y <network-directory> <local-directory> <filename>";
process.Start();