【问题标题】:How do I write 'dummy-data' into a binary file? [closed]如何将“虚拟数据”写入二进制文件? [关闭]
【发布时间】:2014-01-16 10:39:14
【问题描述】:

我在实习时得到了一个任务,基本上是这样的(一切都是用 C# 完成的,在 Visual Studio 2013 中):

  1. 新建二进制文件(特定文件夹)
  2. 清空/删除文件(如果已存在)
  3. 标记开始时间(毫秒精度)
  4. 尽可能快地将 10 GB 的虚拟数据写入文件。 (以 1024 字节的虚拟数据块的形式写入数据,直到写入 10 GB)
  5. 标记结束时间(毫秒精度)
  6. 刷新并关闭文件
  7. 输出写入所有 10 GB 数据所用的时间(结束时间 - 开始时间)
  8. 每秒输出字节数。

可能的输入参数必须是:

  • 文件夹
  • 总字节数(例如 10GB)
  • 每个块的字节数(例如 1024)

现在我对仅仅获得执行此操作的代码并不感兴趣,因为它没有教给我任何东西。我有兴趣了解这是如何完成的,理解它,这样我就可以自己做。

还请注意,我知道这不是一个可以去的网站,只是为了让某人完成您的作业 - 但也了解我对学习这个非常感兴趣,而且我不知道其他任何地方(除了我的导师,但我不想每 20 分钟就来问他一些事情 :P)

有人可以解释一下,或者将我重定向到某个地方吗?也许只是给我一个关于它是如何完成的提示? 我已经使用 C# 大约 2 周了,但我从来没有写过任何创建文件等的东西。

【问题讨论】:

  • 您在作业的哪一部分遇到问题?创建文件?写入文件?生成虚拟数据?获取当前时间?
  • 那么它的哪个部分目前正在引起问题?您已经将项目分解为 8 个任务 - 这些任务您完成了多远?
  • 您是否尝试过仅设置文件的大小/长度?
  • 我建议您开始,尽可能多地,然后针对您遇到的部分提出具体问题。
  • 请给我们看一些代码并解释哪一部分是您遇到困难的部分。你可能想看看 System.IO.FileStream, System.Random

标签: c# binary flush


【解决方案1】:

创建新的二进制文件(特定文件夹)

...

刷新并关闭文件

C# 使用称为 streams 的概念用于二进制输入/输出。

强制性文献:http://msdn.microsoft.com/en-us/library/k3352a4t(v=vs.110).aspx

这两种技术都在 MSDN 上进行了演示。

清空/删除文件,如果它已经存在

嗯,实际上,如果您希望覆盖文件,您只需检查文件是否存在。

标记开始时间(毫秒精度)

...

标记结束时间(毫秒精度)

...

输出写入所有 10 GB 数据所用的时间(结束时间 - 开始时间)

每秒输出字节数。

查看System.Diagnostics 命名空间。

尽快将 10 GB 的虚拟数据写入文件。 (写入数据 作为 1024 字节的虚拟数据块,继续直到 10 GB 写)

最后,节目的肉……


剧透警告!


您必须编写一个循环,在每次迭代中写入 1024 个字节,直到写入的总字节数达到 10GB。

下面是一个代码示例,但没有错误检查(因为它不是必需的)。在现实世界中,您显然也会编写处理异常的代码。

using (var fileStream = File.OpenWrite(path))
{
    double fileSize = Math.Pow(10, 10); // 10 GB
    int bufferSize = 1024; // 1KB
    byte[] buffer = new byte[bufferSize]; // Create an array of zero's

    for (int written = 0; written < fileSize; written += bufferSize)
    {
        // Write 1024 bytes (all zero's: 000000000000...0)
        fileStream.Write(
            array: buffer,
            offset: 0,
            count: bufferSize);
    }
    /* Optional inside a "using" block: */ fileStream.Flush();
}

【讨论】:

  • OP 明确不想要完成的解决方案:P
  • 我知道。我就是忍不住。公平地说,我确实添加了一个剧透警报。
  • :)) 哦,不要在 for 循环的每次迭代中刷新。您应该仅在需要时显式刷新,否则您将尝试绕过 .NET 和操作系统尝试使用的各种优化。对于在写入之间没有“暂停”的顺序写入,它只会使性能变差(平均而言有点,但在某些情况下,例如写入 ehm 软盘驱动器或网络共享,它可能很重要)。仅在最后才需要刷新,但Dispose 无论如何都会处理它,因此即使在那时也不需要它。如果你没有忘记Dispose...
  • 我在这里查看了您的帖子,并重新创建了它。相同的功能,其他变量等,但至少我现在知道它是如何工作的。问题只是它没有。即使通过复制/粘贴您的代码,我也会收到错误:System.ArgumentException: Offest and length were out of bounds for the array or Count is greater than the number of elements from index to the end of the source Collection. 无论我将文件大小和缓冲区大小设置为什么,都会发生这种情况。不过,我非常感谢您的帮助。感谢发帖。
  • 啊,我误解了offset参数。它应该始终为 0。
【解决方案2】:

看看System.IO.File。您想创建一个文件流(静态File.Create),然后在using 子句中,您将使用Stream.Write 通过该流写入数据。我就不多说了,你可以在 MSDN 等上找到足够的信息。但如果需要,请随时提出任何问题。

另外,对于 nitpick,Mark start-time (millisecond precision) 将非常棘手,因为系统日期无法保证您的精确度。所以你可以打印出毫秒,但它不会精确到毫秒。有一个专门用于测量时间间隔的类,找到并使用它:)

【讨论】:

  • 谢谢。我以前从未使用过 File.Create、“using”或“Stream.Write”,所以这就是为什么我不知道如何处理这个分配。我会去研究这些。
【解决方案3】:

查看以下内容以帮助您入门:

  • System.IO.FileStream
  • System.IO.FileMode
  • System.Random
  • System.Diagnostics.Stopwatch
  • System.TimeSpan

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多