【问题标题】:Copy executing files from a UNC path从 UNC 路径复制正在执行的文件
【发布时间】:2013-05-14 00:05:08
【问题描述】:

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

我试过用

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

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

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

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

【问题讨论】:

  • 网络文件服务器和客户端运行的是什么操作系统,您是否必须支持任何其他操作系统版本?我问SMB VSS 在 Windows 2012 上可用,这对您来说是一个很好的解决方案。
  • 该设置是在所有机器上使用 Windows Server 2008 的同构服务设置。

标签: c# .net file process io


【解决方案1】:

要复制另一个进程正在使用的文件,我们必须使用 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 主要专注于有效地复制目录)复制到您的目的地。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 2015-09-13
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多