【问题标题】:FileStream Read/Write method's limitationFileStream 读/写方法的限制
【发布时间】:2011-04-13 19:10:04
【问题描述】:

FileStream 的读/写方法只能将integer 值作为长度。但是FileStreamobject 在long 中返回长度。在这种情况下,如果文件大小大于integer 值(大约超过 2GB)怎么办。那么FileStream的read/write方法是如何处理long值的。

【问题讨论】:

    标签: c# file methods size filestream


    【解决方案1】:

    然后你以多个块读取和写入。无论如何,CLR 对任何特定对象的大小都有限制(也有大约 2GB IIRC,即使在 64 位 CLR 上也是如此),所以你不可能有一个足够大的字节数组来解决它。

    无论如何,您应该在读取时始终循环,因为您不能保证 Read 调用会读取您请求的字节数,即使还有更多数据要来。

    编辑:分块阅读:

    byte[] buffer = new byte[1024 * 32];
    int bytesRead;
    
    while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
    {
        // Use the data you've read
    }
    

    分块写作取决于你在写什么……很难抽象地谈论它。

    【讨论】:

    • 亲爱的,请提供分块读写的例子。
    • @jams:已经编辑了我的答案,但是如果不知道你对数据做了什么,就很难给出具体的代码。
    • 其实我要从硬盘读写一个视频文件,它的大小大于2GB。我很难理解你的块读/写示例。但这不是我会处理的问题。
    • 亲爱的@JonSkeet,你是​​一颗宝石。当我要求您提供示例时,我希望您不会提供示例,因为 SO 的大多数高级成员对这种愚蠢的要求表现得很粗鲁。但是你提供了它,因为你有一颗善良的心,你是一个真正的绅士。祝你早日完成300K声望点数。
    【解决方案2】:

    一次调用无需直接写入超过2Gb的数据

    如果您真的要在内存中连续缓冲该数量(?可能作为不安全获取的 UnmanagedMemoryStream 来实现核心转储?)您可以轻松地在多个调用中批量写入。无论如何,它将在当前硬件上以 512k 到最大 4k 的块写入磁盘。

    “流式传输”接口的巨大价值在于您可以以任何方式拥有它。其实when you look into to it you will find that the CLR Arrays (and anything else) are actually bounded to 2GB

    更新

    既然您现在已经承认您基本上想要复制流,那么使用即时解决方案可能会更好。有File.Copy

    File.Copy("file-a.txt", "file-new.txt");
    

    或者有the standard answer

    Stream input
    input.CopyTo(output); // .NET 4.0
    
    // .NET 3.5 and others
    public static void CopyStream(Stream input, Stream output)
    {
        byte[] buffer = new byte[32768];
        while (true)
        {
            int read = input.Read (buffer, 0, buffer.Length);
            if (read <= 0)
                return;
            output.Write (buffer, 0, read);
        }
    }
    

    如果您手动处理流,请不要忘记 FlushingClosingDisposing 您的流

    干杯

    【讨论】:

    • 在回复 OP 评论“实际上我必须从 HDD 中读取和写入一个大小超过 2GB 的视频文件”时提供了一些有用的提示”跨度>
    【解决方案3】:

    据我所知,您仍然可以使用 seek 到达流中的正确位置。

    您可能需要循环播放,如果您想阅读超过 2 场演出,您也需要在此处循环播放

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 2015-12-01
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      相关资源
      最近更新 更多