C# 传递流的子序列,而不将其内容复制到新实例中

C# 传递流的子序列,而不将其内容复制到新实例中,c#,stream,filestream,C#,Stream,Filestream,假设我有以下方法: void Upload(Stream stream) { // uploads the content of the specified stream somewhere } 让我们进一步假设我得到了一些二进制文件f,其中包含一些我想用上述方法上传的数据。 但是:我想上传的不是整个文件。它只是f的一部分。更确切地说,想要的数据在某个位置开始,代码“>S>=0</CODE”,并结束在某个位置 E> P>请考虑使用,以“访问”流的某个部分。 要拥有一个具有适当长度的独立

假设我有以下方法:

void Upload(Stream stream)
{
    // uploads the content of the specified stream somewhere
}
让我们进一步假设我得到了一些二进制文件
f
,其中包含一些我想用上述方法上传的数据。 但是:我想上传的不是整个文件。它只是
f
的一部分。更确切地说,想要的数据在某个位置开始,代码“>S>=0</CODE”,并结束在某个位置<代码> E> P>请考虑使用,以“访问”流的某个部分。

要拥有一个具有适当长度的独立
实例,似乎需要实现一个
子流
类-表示子流的包装器。以下参考可用于实现此类包装器:

  • 请考虑使用,以“访问”流的某个部分。

    要拥有一个具有适当长度的独立
    实例,似乎需要实现一个
    子流
    类-表示子流的包装器。以下参考可用于实现此类包装器:


  • 如果在调用方法之前修改原始流中的指针将起作用,则使用设置起始位置和结束位置。然后,您可以将流传递给该方法,并且它应该只接触该部分(假设它不在内部查找回起始部分)

    不幸的是,
    SetLength
    将截断流,因此如果出于某种原因需要,您以后将无法访问流的其余部分。然而,如果这不是一个要求,这应该是可行的

    编辑:由于您需要保留原始流,我可以考虑以下其他选项:

    • 如果您有权访问该路径(并且该路径未被另一个流锁定),则可以向该文件打开一个新流,并发送该流的截断版本
    • 您可以将所需的部分复制到一个新流中,例如
      MemoryStream
      。您不需要复制整个文件,但需要使用和复制要上载的部分

    • 您可以编写自己的流实现,只访问另一个流的特定部分


    如果在调用方法之前修改原始流中的指针将起作用,则使用设置开始位置和结束位置。然后,您可以将流传递给该方法,并且它应该只接触该部分(假设它不在内部查找回起始部分)

    不幸的是,
    SetLength
    将截断流,因此如果出于某种原因需要,您以后将无法访问流的其余部分。然而,如果这不是一个要求,这应该是可行的

    编辑:由于您需要保留原始流,我可以考虑以下其他选项:

    • 如果您有权访问该路径(并且该路径未被另一个流锁定),则可以向该文件打开一个新流,并发送该流的截断版本
    • 您可以将所需的部分复制到一个新流中,例如
      MemoryStream
      。您不需要复制整个文件,但需要使用和复制要上载的部分

    • 您可以编写自己的流实现,只访问另一个流的特定部分


    恐怕这在这里是不可能的。我正在处理一些混合的序列化数据,需要使用AWS SDK上传其中的一部分,该SDK接受文件路径或
    。即使我相应地设置了
    Position
    属性,我也无法限制流的长度,而不固定实际的流(我猜…。@wodzu,谢谢你指出。答案已经更新。实现
    子流
    类绝对是个好主意。明天我将回顾这篇文章和Xavier的建议,告诉你们我决定做什么。我最终使用了Marc Gravell在第一个链接中的解决方案。这正是我想要的for@wodzu伟大的很高兴能帮上忙。恐怕这在这里是不可能的。我正在处理一些混合的序列化数据,需要使用AWS SDK上传其中的一部分,该SDK接受文件路径或
    。即使我相应地设置了
    Position
    属性,我也无法限制流的长度,而不固定实际的流(我猜…。@wodzu,谢谢你指出。答案已经更新。实现
    子流
    类绝对是个好主意。明天我将回顾这篇文章和Xavier的建议,告诉你们我决定做什么。我最终使用了Marc Gravell在第一个链接中的解决方案。这正是我想要的for@wodzu伟大的很高兴它起到了作用。不幸的是,我正在访问该流的一个单音实例,不能使用trunctad,因为后续调用很可能希望访问truncted范围之外的其他部分。更新了其他建议。当我看到你提到
    MemoryStream
    时,我直觉上拒绝了你的想法,但是当我考虑上传大文件时,我得出了一个结论,在上传之前最好将文件分割成块。我当然希望避免出现这样的情况:在连接出现问题的情况下,我必须重新初始化完整文件的上传。幸运的是,AWS SDK(我正在使用)提供了几个部分来上传文件。这绝对是你的一篇有用的文章。我在明天更新了这个问题,因为现在在中欧已经有点晚了。不幸的是,我正在访问该流的一个单音实例,不能使用trunctad,因为后续调用很可能需要访问trunctated范围之外的其他部分。更新了其他建议。当我看到你提到
    内存时
    
    byte[] data = new byte[size];
    stream.Seek(position, SeekOrigin.Begin);
    stream.Read(data, 0, size);
    using (MemoryStream subStream = new MemoryStream(data))
    {
        Upload(subStream);
    }