【发布时间】:2015-07-01 12:23:29
【问题描述】:
我有一个文件要复制到某个位置。下面是代码sn-p -
//Document Status = Pending
var triggerFileWriter = new StringWriter();
triggerFileWriter.WriteLine("Only for test");
System.IO.File.WriteAllText(fullTriggerFilename, triggerFileWriter.ToString());
triggerFileWriter.Dispose();
if (System.IO.File.Exists(fullTriggerFilename))
{
// Document Status = Processed
}
File.Exists 检查是否足以更新文档状态?
我不担心文件没有被复制并且文件状态没有更新。因为每 10 分钟有一个计时器作业运行,所以“待处理”项目将在下一次运行时自动拾取。
文件复制是否有可能被中断 - 这可能导致文件但实际上没有完全复制? 如果发生这种情况,我可以对我的代码进行哪些更改来解决。
谢谢!
【问题讨论】:
-
有写缓存,所以你必须flush 来确保它是真正安全的。当然,除了在
WriteAllText期间没有出现异常。 -
@Sinatr
Flush也不再等待 HDD 物理保存数据。在现代系统上,除非您有检查文件完整性的方法或依赖允许创建原子文件的文件系统(如 NTFS),否则根本无法确定。更重要的是,它并没有解决 OP 的问题——他不需要确保文件被正确写入,他只需要知道他现在要处理的文件是否需要处理。跨度> -
@Luaan,你检查了我评论中的链接问题吗?
-
@Sinatr 是的。
FlushFileBuffersstill 不能确保文件被物理写入。 OS 也无法强制 HDD 保存内部缓冲区。确实,它强制 Windows 将数据发送到 HDD,但 HDD 有自己的内部缓存。FlushFileBuffers的用途非常小众 - 对于那些想要感觉比实际控制更多的人来说:D -
@Luaan,HDD 内部缓存 是关键。操作系统功能可能不会走那么远(和/或一些制造商无论如何都会欺骗它以获得更高的基准)。你说的对。当数据完整性可能是最高优先级时,我不会考虑性能,但刷新根本不起作用。 UPS 也可能发生故障(它可能与电源故障同时发生故障^^)。剩下的唯一方法是使用
File.Exists,但提供另一种数据完整性方式,例如making backups.
标签: c#