2

假设我创建了一个名为“lotsofdata”的长字符串,然后使用以下代码输出其内容:

        string outputFilePath = @"C:\output.txt";
        System.IO.File.WriteAllText(outputFilePath, lotsofdata);

        SpecialFunction1();
        SpecialFunction2();
        SpecialFunction3();

我的问题是,在继续运行 SpecialFunction1 之前,计算机是否完全完成了将所有内容写入 output.txt 的操作?或者,它是否启动了输出过程并在输出过程完成之前移动到 SpecialFunction1?

我问是因为我想确保在继续进行 SpecialFunction1() 之前完成写入 output.txt 并且我不知道如何确保这一点。

4

4 回答 4

8

简单的答案是肯定的。

在方法退出之前,底层流被填充和关闭(重要的一点) 。WriteAllText

File.WriteAllText 方法

创建一个新文件,将内容写入文件,然后关闭文件。如果目标文件已存在,则将其覆盖。

http://msdn.microsoft.com/en-us/library/system.io.file.writealltext%28v=vs.110%29.aspx

这不是所有文件写入的黄金法则。如果您直接写入 a FileStream,则需要确保您调用FlushClose(理想情况下,您应该始终调用Close)如果您想确保在继续之前实际写入文件。

FileStream.Close 方法

之前写入缓冲区的任何数据都会在文件流关闭之前复制到文件中,因此在调用 Close 之前无需调用 Flush。在调用 Close 之后,对文件流的任何操作都可能引发异常。Close 被调用一次后,如果再次调用,它什么也不做。

http://msdn.microsoft.com/en-us/library/aa328800%28v=vs.71%29.aspx

这里的关键要点是,任何刷新流的操作都不会退出,直到数据被写入其目的地。

于 2013-10-31T15:15:25.330 回答
6

是的,在首先提供的代码中,您将完成将文本写入文件,然后才能运行其他SpecialFunction功能。

根据File.WriteAllText文档:

该方法保证文件句柄关闭,即使引发异常

因此,即使在大文件上也不应该有任何并发​​ IO 问题。

于 2013-10-31T15:14:09.450 回答
5

System.IO.File.WriteAllText完成后,会将所有文本刷新到文件系统缓存,然后将其延迟写入驱动器。

于 2013-10-31T15:20:19.493 回答
1

所有这些都发生在同一个线程中,因此您的文件将在其他任何事情发生之前被写入。

于 2013-10-31T15:14:48.123 回答