【问题标题】:Difference between File.Replace and (File.Delete+File.Move) in C#C# 中 File.Replace 和 (File.Delete+File.Move) 的区别
【发布时间】:2011-05-13 09:37:44
【问题描述】:

今天我遇到了一个奇怪的问题:自从一年和应用程序的多个版本/测试以来,以下代码已成功用于将文件替换为另一个文件。

File.Replace(path + ".tmp", path, null);

这在本地和 UNC 路径(网络共享)上都有效。但是今天当我使用此代码替换 UNC 路径上的文件时出现以下错误(本地仍然有效):

该进程无法访问该文件,因为它正被另一个进程使用

当我使用以下代码而不是上面的代码时,它可以工作:

File.Delete(path);
File.Move(path + ".tmp", path);

所以我的问题:

  • 这两个代码sn-ps有什么区别?
  • 难道是微软改变了“File.Replace”的工作方式?

我将 .Net Framework 4.0 与 Visual Studio 2010 一起使用。

提前致谢。

【问题讨论】:

  • 您不会碰巧在服务器上运行这些超级渴望的“安全工具”之一,弄乱它们的“访问保护”或其他东西,对吧?每个服务器都会发生这种情况吗?它是否在特定日期停止工作以及 - 在那个时间点服务器上发生了什么?
  • 感谢您的回答:我们没有特殊的“über”安全工具,并且有一段时间没有更改基础架构。该问题也出现在其他网络中的其他机器上。我不知道确切的日期,但我会说在 2011 年 2 月之前它已经起作用了......
  • File.Replace 要求对源和目标都具有读写权限,然后 p/invokes ReplaceFile。检查ReplaceFile 上的文档以获取线索。 msdn.microsoft.com/en-us/library/aa365512.aspx
  • 我们只能猜测 - 它应该可以工作。正如 Tergiver 所说,该方法并没有做任何特别的事情。并且您确定您的代码(我假设是写入 *.tmp)关闭了该文件?因为正如 Tergiver 所说,再次请求 两个文件 的读写权限。第一的。在该方法发生任何事情之前。可能为您的作家错过了一次处置?我想说的是:不要过分关注目标文件。两者都可能是问题所在(除非错误明确涉及目标)。
  • 我检查了我对这两个文件的所有其他操作的处置/关闭,没有 - 没有丢失处置/关闭...

标签: c# .net


【解决方案1】:

根据MSDN on File.Replace

File.Replace 会在...时抛出异常

  • 目标文件丢失。
  • 源和目标位于不同的卷上

哪个 File.Delete,File.Move 不会。

【讨论】:

  • 所以如果源和目标在不同的卷上,它会抛出异常吗?这到底是什么实现...感谢您的链接!
  • @dataCoreReplace的目的是替换文件。使用移动 + 删除时,您只需创建一个新文件。 Replace 保留安全属性、备用数据流、文件 ID、加密、压缩、创建日期等。请注意,File.Move 跨卷工作的唯一原因是它通过回退到 Copy+Delete(底层 winapi)专门实现该功能MoveFile 不允许在卷之间移动文件,原因很明显(在一个卷上移动文件是一种更改文件路径的行为,不涉及复制)。
【解决方案2】:

这是File.Replace()上的MSDN article

创建原始备份似乎有所不同。

【讨论】:

  • 感谢您的回答。你的意思是因为我没有指定备份路径?我还是不明白...早些时候它已经奏效了。 *编辑:我尝试使用备份路径 - 仍然是相同的错误消息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 2013-10-25
  • 1970-01-01
  • 2012-12-21
相关资源
最近更新 更多