通过NetworkStream传输存档



我想通过TCP连接复制目录树。源端应该从文件系统中的某个地方开始,递归地收集所有文件,并通过NetworkStream将它们发送到接收端。这看起来就像我可以在源端创建一个ZIP文件并将其发送到客户端。但也有一些要求:

  • 不应该创建任何临时文件
  • 内存中不应该创建任何文件
  • 数据应在频带内发送

前两个要求可以通过NetworkStream发送ZIP存档来满足。由于访问权限问题,应避免使用临时文件。目录树可能包含大量数据,这些数据可能会导致内存不足问题。第三个要求有点复杂。在源和汇点之间应该只建立一个TCP连接。

该协议在数据传输之前使用相同的连接来交换元信息(如目录名),并且在数据传输之后至少确认成功传输以及数据已写入文件系统。

我已经试过SharpZipLib了。但是,当读取流时,它总是读取4K字节的块。它需要一个流的末尾来标识ZIP归档的末尾。这是不合适的,因为存档应该在带内。

DotNetZip库文档提到,它需要一个可查找的流,而这对于NetworkStream来说是不可用的。

如何传输这样的目录结构?

Edit澄清了文件数据必须嵌入同一TCP流中。

DotNetZip似乎不直接支持不可查找的流,这是对的。但它要求这样做的唯一原因是,它需要知道不可查找流不支持的Position

要解决此问题,只需将NetworkStream封装在作为DotNetZip的一部分提供的CountingStream中即可。如果你这样做,你应该能够很好地使用ZipOutputStream

作为替代方案,如果您不需要压缩,您可以创建自己的类tar协议。

类似的东西

  • 文件名长度为4字节,包括路径(M)
  • 文件长度为8字节(N)
  • M字节的文件名(包括路径),使用UTF-8编码
  • 文件本身内容的N个字节

在每个文件之前。

相关内容

  • 没有找到相关文章

最新更新