我一直试图使用C# MonoTorrent库,但缺乏文档无助于此。我试图流一个文件,但要做到这一点,我需要一个事件,无论何时,一个片段被写入文件,或类似的东西。
我知道有一个事件在任何时候都会被触发,但是当我需要实际的内容时,它就不那么有用了。
所以我想问我怎么知道什么时候一个片段被写到了一个文件中,这样我就可以解析它,然后再流到那个电影。
我已经看过了TorrentManager、ClientEngine、DiskManager,在这些类中没有发现任何有用的东西,也没有发现任何其他Manager类。现在,这个特性只是隐藏在某个地方,还是我必须做一些不同的事情来获得下载的片段?
发布于 2019-11-18 00:37:53
PieceHashed事件是您所需要的。当引发该事件时,可以保证与该事件关联的数据已被接收、验证并写入DiskManager。
如果使用MemoryWriter,则在引发事件时,该数据可能不会写入底层硬盘/SSD。为了保证您需要调用FlushAsync方法,传入TorrentManager和片段索引。如果一个片段的大小为256 6kb,并且在第6部分中包含三个长度为200 6kb、50 6kb和6kb的文件,那么如果将'6‘作为片段索引传递,所有这些文件都将被刷新。如果您调用不需要PieceIndex的重载,那么它将刷新每个文件。
如果您正在编写类似于SlidingWindowPicker的内容,那么您可能应该只在下载了高优先级集中的一篇文章时才调用FlushAsync。任何对刷新的调用都将刷新给定文件(或所有文件)的所有挂起的数据。如果您拥有的唯一数据来自洪流的最末端,那么立即冲洗它不会影响您的流能力,但它可能会增加管理费用。
发布于 2019-11-20 09:42:55
还有一种选择,即实现IPieceWriter并创建一个包装器,每当编写适当的片段时,该包装器就会刷新。
现有的MemoryWriter展示了如何创建包装器。它的写方法实现如下: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);
}https://stackoverflow.com/questions/58890423
复制相似问题