我想通过TCP连接复制目录树。源端应该从文件系统的某个地方开始,递归地收集所有文件,并通过NetworkStream将它们发送到接收器端。这看起来有点像我可以在源端创建一个ZIP文件,并将其发送到客户端。但也有一些要求:
前两个需求可以通过NetworkStream发送一个ZIP存档来满足。由于访问权限问题,应避免临时文件。目录树可以包含大量的数据,这会导致内存不足的问题。第三个要求更复杂一些。源和接收器之间只应建立一个TCP连接。
该协议在数据传输之前使用相同的连接来交换像目录名这样的元信息,在数据传输之后至少确认成功的传输,并且数据已经写入文件系统。
我已经试过SharpZipLib了。但是,在读取流时,它总是读取4 KByte的块。它需要流的结束来标识ZIP存档的结束。这是不合适的,因为档案应该在乐队内。
DotNetZip库文档提到,它需要一个可查找的流,这对于NetworkStream来说是不可用的。
如何转移这种目录结构?
编辑澄清了文件数据必须嵌入在同一个TCP流中。
发布于 2012-02-14 17:34:38
你是对的,DotNetZip似乎不直接支持不可查找的流。但是它需要这样做的唯一原因是因为它需要知道不可查找的流不支持的Position。
要解决这个问题,只需将NetworkStream包装在CountingStream中,作为DotNetZip的一部分提供。如果这样做,您应该能够很好地使用ZipOutputStream。
作为另一种选择,如果您不需要压缩,您可以创建自己的类tar协议。
有点像
进行编码。
在每一份文件之前。
https://stackoverflow.com/questions/9261428
复制相似问题