0

我一直在尝试使用 C# MonoTorrent 库,但缺少文档并没有帮助。我正在尝试流式传输文件,但要做到这一点,每当将 Piece 写入文件或类似的东西时,我都需要一个事件。

我知道只要对 Piece 进行散列处理,就会触发一个事件,但是当我需要实际内容时它就不是那么有用了。

所以我想问一下,我如何知道片段何时被写入文件,这样我就可以解析它,然后流式传输该电影。

我已经看过了,TorrentManagerClientEngineDiskManager这些类中的任何一个或任何其他 Manager 类中都没有发现任何有用的东西。现在这个功能只是隐藏在某个地方还是我必须做一些不同的事情才能获得下载的作品?

4

2 回答 2

1

PieceHashed 事件是您所需要的。当该事件引发时,您可以保证与该片段相关的数据已被接收、验证并写入 DiskManager。

如果正在使用MemoryWriter,则在引发事件时,数据可能不会写入底层硬盘驱动器/SSD。为保证您需要调用FlushAsync方法,传入 TorrentManager 和片段索引。如果一个片段大小为 256kB,并且片段 6 中包含三个长度分别为 200kb、50kb 和 6kb 的文件,那么如果您传入“6”作为片段索引,所有这三个文件都将被刷新。如果您调用不采用 PieceIndex 的重载,它将改为刷新每个文件。

如果您正在编写类似SlidingWindowPicker的东西,那么您应该只在下载了高优先级集中的片段时才调用 FlushAsync。任何对 flush 的调用都会刷新给定文件(或所有文件)的所有待处理数据。如果您拥有的唯一数据来自洪流的最后,那么立即刷新它不会影响您的流式传输能力,但可能会增加开销。

于 2019-11-18T00:37:53.443 回答
0

还有一种替代方法,即实现 IPieceWriter 并创建一个包装器,该包装器在写入适当的片段时刷新。

现有的 MemoryWriter 展示了如何创建包装器。它的 Write 方法实现如下:https ://github.com/mono/monotorrent/blob/2209922c4159e394242c6c337401571312642b6e/src/MonoTorrent/MonoTorrent.Client.PieceWriters/MemoryWriter.cs#L118-L123 。

如果你想写一些东西来自动刷新碎片,你会做这样的事情:

public void Write(TorrentFile file, long offset, byte[] buffer, int bufferOffset, int count, bool forceWrite)
{
    Writer.Write(file, offset, buffer, bufferOffset, count);
    Writer.Flush(file);
}
于 2019-11-20T09:42:55.517 回答