2013-05-19 39 views
3

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

我试图与

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

打开文件我打开我创造另一个流复制到文件流之后。

但是,这会引发异常,指出该文件正在被另一个进程使用。我不知道如何解决这个问题。如果我只使用文件资源管理器,它会复制文件。所以我知道这是可能的,只是不确定如何。

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

+0

卷影复制服务可能会帮助你:http://www.codeproject.com/Articles/22745/Volume-Shadow-Copies-from-NET – k0stya

+0

什么操作系统是网络文件服务器和客户端运行,你必须支持任何一方的任何其他操作系统版本?我问,作为[SMB VSS](http://technet.microsoft.com/en-us/library/jj612865.aspx)在Windows 2012上可用,将是一个很好的解决方案。 –

+0

安装程序是在所有机器上与Windows Server 2008同构的服务设置。 – btlog

回答

0

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

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

他们可以保留为手动启动,所以他们并不需要运行所有的时间。

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

下载链接: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主要着眼于高效复制目录)到您的目的地。