【发布时间】:2016-04-30 14:59:15
【问题描述】:
我正在寻找如何在 .net 中执行简单的事务性 POSIX 样式 rename():
如果新参数命名的链接存在,则应将其删除并将旧的重命名为新的。在这种情况下,一个名为 new 的链接将在整个重命名操作期间对其他进程保持可见,并在操作开始之前引用 new 或 old 引用的文件。
在重命名要替换它的新文件之前,我不应该删除目标文件。删除然后重命名意味着新名称可能会在非零时间内返回“找不到文件”,如果此时进程或机器崩溃,情况会更糟。
关键是要实现简单的事务文件更新模式,如果我可以先成功地将替换文件写入磁盘,我只想替换文件。我真的希望对这种基本文件系统访问操作的支持不需要 pinvoke 或任何花哨的东西。我应该能够:
- 写一个新文件。
- 关闭它的
FileStream以刷新它。 - 在旧文件上重命名该文件(假设 FS 将在其日志的帮助下保证在文件实际刷新到硬件之前不会保留此步骤,并且此重命名操作本身是原子的)。
重命名功能隐藏在 .net 的 BCL 中的什么位置?它不在那里吗?如果不存在,是不是因为 .net 是在 Windows 9x 仍受支持的环境时编写的?还是现代 Windows 仍然不支持非特权进程的此类操作?
【问题讨论】:
标签: .net windows io file-rename