簡體   English   中英

寫入時的 MonoTorrent 事件

[英]MonoTorrent Event when piece written

我一直在嘗試使用 C# MonoTorrent 庫,但缺少文檔並沒有幫助。 我正在嘗試 stream 一個文件,但要做到這一點,每當將 Piece 寫入文件或類似的東西時,我都需要一個事件。

我知道只要對 Piece 進行散列處理,就會觸發一個事件,但是當我需要實際內容時它就不是那么有用了。

所以我想問我怎么知道一個片段何時被寫入文件,所以我可以解析它,然后 stream 那部電影。

我已經查看了TorrentManagerClientEngineDiskManager ,但在這些類中的任何一個以及任何其他 Manager class 中都沒有發現任何有用的東西。 現在這個功能只是隱藏在某個地方還是我必須做一些不同的事情才能獲得下載的作品?

PieceHashed 事件是您所需要的。 當該事件引發時,您可以保證與該片段相關的數據已被接收、驗證並寫入 DiskManager。

如果正在使用MemoryWriter ,則在引發事件時,數據可能不會寫入底層硬盤驅動器/SSD。 為保證您需要調用FlushAsync方法,傳入 TorrentManager 和片段索引。 如果一個片段大小為 256kB,並且片段 6 中包含三個長度分別為 200kb、50kb 和 6kb 的文件,那么如果您傳入“6”作為片段索引,所有這三個文件都將被刷新。 如果您調用不采用 PieceIndex 的重載,它將改為刷新每個文件。

如果您正在編寫類似SlidingWindowPicker的東西,那么您應該只在下載了高優先級集中的片段時才調用 FlushAsync。 任何對 flush 的調用都會刷新給定文件(或所有文件)的所有待處理數據。 如果您擁有的唯一數據來自洪流的最后,那么立即刷新它不會影響您使用 stream 的能力,但可能會增加開銷。

還有一種替代方法,即實現 IPieceWriter 並創建一個包裝器,該包裝器在寫入適當的片段時刷新。

現有的 MemoryWriter 展示了如何創建包裝器。 它的Write方法實現如下: https://github.com/mono/monotorrent/blob/2209922c4159e394242c6c337401571312642b6e/src/MonoTorrent/MonoTorrent.Client.PieceWriters-L123.Writer .

如果你想寫一些東西來自動刷新碎片,你會做這樣的事情:

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM