从UNC路径复制执行文件

时间:2013-05-19 07:44:53

标签: c# .net file process io

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

我尝试用

打开文件
using (var source = new FileStream(fileData.FileName, 
                                   FileMode.Open, 
                                   FileAccess.Read, 
                                   FileShare.ReadWrite))

打开文件流后,我创建了另一个要复制的流。

但是,这会引发异常,说该文件正由另一个进程使用。我不知道如何解决这个问题。如果我只使用文件浏览器,它将复制文件。所以我知道这是可能的,只是不确定如何。

编辑: 我也尝试过简单的File.Copy(source, destination),我得到了同样的异常,说该文件正由另一个进程使用。

1 个答案:

答案 0 :(得分:0)

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

  • 卷影复制
  • Microsoft软件卷影复制提供程序

它们可以保留为手动启动,因此它们不需要一直运行。

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

下载链接:https://github.com/candera/hobocopy/downloads

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

命令行语法:

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

C#代码:

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();

这将复制目的地正在使用或未使用的所有文件(hobocopy主要关注复制目录)。