使用Move然后复制覆盖锁定的文件

时间:2011-03-31 21:58:40

标签: c# file-io io

我正在尝试编写一个程序,用于将更新应用于应用程序。由于应用程序的性质,某些文件将被锁定(主要由IIS),并且不能使用File.Copy(target)覆盖。手动执行任务时,我们的支持团队通常会使用Windows资源管理器复制文件,这会解锁文件,允许他们复制新文件。

为什么在使用Windows资源管理器时这样做有用?为什么在代码中这样做时会失败呢?

我使用的代码大致如下:

File.Move( target, tempPath )
File.Copy( source, target )

使用单元测试打开并锁定您尝试覆盖的文件:

var source = "c:\\source.txt";
var target = "c:\\target.txt";
var temp = "c:\\temp\\fake-target.txt";

using ( var lockedFile = System.IO.File.OpenWrite( target ) ) {
    File.Move( target, temp )
    File.Copy( source, target )
}

任何建议都会很棒。谢谢你的帮助。

3 个答案:

答案 0 :(得分:2)

您无法在应用程序或Windows资源管理器中移动锁定的文件。在软件运行时执行更新的常用方法是将所有内容写入临时文件(例如program.exe.temp)。更新完成后,退出应用程序,将所有原始文件替换为临时文件(可能使用较小的更新程序),然后重新启动应用程序。这样,您也可以取消更新过程(直到最后一步之前),而不必干扰已安装的版本。

答案 1 :(得分:2)

请注意,您的 temp 文件名无效,缺少额外的反斜杠。

重命名正在使用的文件适用于为其创建了内存映射文件的文件。就像在进程中加载​​的.exe和.dll文件一样。它不适用于使用FileStream打开的文件。这将是相当糟糕的,当文件关闭时,Windows将无法更新文件的元数据。喜欢文件大小和最后写日期。

这应该足以应用更新,您的代码段根本不能很好地模拟相同的操作。

答案 2 :(得分:1)

请注意,你在哪里有所作为。你可以在本地逃脱,但不能远程。并非所有操作系统都允许它。