【问题标题】:Windows - C#- Directory.MoveWindows - C#- Directory.Move
【发布时间】:2011-11-30 04:21:08
【问题描述】:

只要 Directory.Move 在同一个逻辑驱动器上,是否保证只重命名而不复制/删除?

【问题讨论】:

  • 我不会依赖它。那里不仅有 NTFS,如果你在这个假设下编写代码,它可能随时在其他机器或磁盘上中断,具体取决于你无法控制的细节。
  • 如果应用程序只在 NTFS 上运行,你会依赖它吗?!
  • 不,我不会,但下面似乎大卫有另一个想法/知识

标签: c# windows io


【解决方案1】:

事实上,如果您尝试将目录移动到不同的卷,Directory.Move 会失败。如果您想执行这样的移动,您必须自己进行复制/删除。我认为您可以放心地假设Directory.Move 只有在无需复制文件即可执行操作的情况下才会成功。

【讨论】:

  • 谢谢大卫,但你确定吗?和上面的链接有点矛盾?!!还是我错过了什么?
  • 该链接似乎在讨论文件。您的问题涉及目录。 Directory.Move 文档明确指出跨卷移动将失败。
  • 是的,你是对的,目录的规则与文件的规则不同,这很奇怪。但我对同一个卷更感兴趣,我想确定它永远不会执行复制/删除操作,只要它是同一个卷。如果真的发生了,在什么情况下?我想我们不能这么肯定,但就像你说的那样,假设是安全的。但同样,由于 File.Move 和 Directory.Move 在内部使用相同的调用(Win32Native.MoveFile),我有点怀疑。
  • 看看MoveFileExMOVEFILE_COPY_ALLOWED。我认为您必须寻找不同的 API 并特别要求替代行为这一事实向我表明 MoveFile 永远不会使用复制/删除来完成它的工作。
【解决方案2】:

Directory.Move 是一个原子操作,如果这就是你的意思。它不会作为 2 次操作来执行。至少在 NTFS 上。

【讨论】:

  • 感谢 George,但我更感兴趣的是需要多少时间。如果它是即时的,我就不会担心其他进程或线程试图从错误的位置读取或写入。
猜你喜欢
  • 2013-02-17
  • 2017-09-05
  • 1970-01-01
  • 2016-01-11
  • 2013-09-26
  • 2017-07-28
  • 2017-03-18
  • 2020-06-17
  • 1970-01-01
相关资源
最近更新 更多