2014-01-20 107 views
3

我想我可以在问之前试一试,但只是想确定甚至有可能在我浪费任何时间之前。可以同时写入/读取同一个数据流吗?

我试图消除内存或物理文件缓冲区的需要。我想通过HTTP或者FTP(或者其他任何方式)下载一个文件,并且在流被填充的同时,我想同时开始将该流(通过HTTP,FTP等)上传到其他地方。

这在.NET中甚至可能吗?我认为做“传统”的唯一方法是首先允许流完成,然后将该流从内存中复制到另一个流中,但我想使用最少量的资源(时间,内存等)作为可能。

+1

这应该可以正常工作。 – SLaks

+0

“传统上,我能想到的唯一方法就是首先让流完成” - 这根本不正确;它总是有可能(实际上是普通的)读取一个流的块并将它们放入第二个流中循环。 –

回答

7

这完全有可能,没问题;但是你不会使用相同的数据流,你可以使用两个不同的数据流,并且将数据从输入传输到输出循环中。

+0

这就是我想要做的,但可能没有说清楚。我想使用相同的流,所以这是不可能的?您在这里提出的解决方案似乎是,您必须先等待源码流完成,然后再复制到其他码流进行进一步处理。我真正要求的是在同一时间使用相同的流,所以不会有任何延迟。例如,您开始下载到STREAM,并在该瞬间(在完成之前)开始使用该STREAM作为其他内容。 – SoftwareGuy74

+1

@ user2524616很明显,你绝对可以做到这一点。你的困惑是关于重用对象。您不*使用单个流对象进行下载和上传。您将在一个*输入*流对象上接收数据,然后使用不同的*输出*流对象上传它。您将数据从一个数据传输到另一个数据。在执行此操作之前,您绝对不需要等待输入“完成”。 – TypeIA

+0

@ user2524616如果你确实做了很长时间,那么当你想要上传它时,你会怎么做呢?您可以从'FileStream'复制到您的'NetworkStream'中,该文件指向您的上传位置。只需使用您在那里使用的代码,但用指向您的下载的'NetworkStream'替换'FileStream'。 –

1

应该没问题。最近版本的.Net支持Stream.CopyToAsync(otherStream)(或其non-async counterpart),这几乎是一个完整的解决方案。

+0

请参阅我对dvnrrs的回应。我希望在复制到第二个流之前不必等待第一个流完成。另外,我需要使用.NET 4,所以我没有CopyToAsync。 – SoftwareGuy74

+0

@ user2524616 CopyTo和CopyToAsync不会立即使用输入流,它们会从输入中读取缓冲区的值,然后将其写入输出。通常缓冲区是几个(4左右)千字节。 CopyTo在.Net4中可用,所以如果你可以保持同步,那就使用它。 – spender

+1

由于某种原因,这不适合我。我一直得到0字节的大小。这似乎是我必须首先将输入流设置为position = 0,这打破了我所要做的全部目的,因为我需要等待输入流填充后。我想在第一个流写入的同时复制到第二个流。 – SoftwareGuy74

相关问题