【问题标题】:In my C# code does the computer wait until output is complete before moving on?在我的 C# 代码中,计算机是否等到输出完成后再继续?
【发布时间】:2013-11-11 16:14:39
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# io


    【解决方案1】:

    简单的答案是肯定的。

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

    File.WriteAllText 方法

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

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

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

    FileStream.Close 方法

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 你好,“懒洋洋”的写法是什么意思?听起来很特别,但我不知道你指的是什么。
      • @phan 'Lazy' 通常用于表示“在需要时处理”。 Alberto 的意思是“异步”或“在后台”。但是,您无需担心这一点,因为对于您的应用程序而言,文件系统缓存和物理卷内容是相同的。
      【解决方案3】:

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

      【讨论】:

      • 在使用 IO 时并不总是如此,在这种特定情况下才是正确的。如果他没有使用WriteAllText 而是使用某种StreamWriter 并且从未关闭文件,则文本的最后几位可能位于缓冲区中并且没有写入磁盘。
      【解决方案4】:

      是的,在首先提供的代码中,您将完成将文本写入文件,只有 之后 将运行其他 SpecialFunction 函数。

      根据File.WriteAllText 文档:

      这个方法保证文件句柄是关闭的,即使 引发异常

      所以您不应该即使在大文件上也不会出现任何并发 IO 问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-08
        • 2021-11-27
        • 1970-01-01
        相关资源
        最近更新 更多