-1

编辑1:

我构建了一个 torrent 应用程序;同时从不同的客户端下载。每个下载代表我的文件的一部分,不同的客户端有不同的部分。下载完成后,我需要通过在我的文件中查找“空”部分来了解我现在需要实现的部分。

创建具有固定大小的文件的一种方法:

File.WriteAllBytes(@"C:\upload\BigFile.rar", new byte[Big  Size]);

我的部分 Arr 将我的文件表示为部分:

BitArray TorrentPartsState = new BitArray(10);

例如:

文件大小为 100。

  TorrentPartsState[0] = true; // thats mean that in my file, from position 0 until 9 I **dont** need to fill in some information.
  TorrentPartsState[1] = true; // thats mean that in my file, from position 10 until 19 I **need** to fill in some information.

即使计算机/应用程序关闭,我也找到了一种有效的方法来保存 BitArray 包含的内容。我坚持的一种方法是通过 xml 文件并在每次完成部分时更新它。

我认为它不是聪明有效的解决方案。对另一个有什么想法吗?

4

3 回答 3

1

您可以使用BitArray(在 System.Collections 中)。

然后,当您访问文件中的偏移量时,您可以将该偏移量处的 BitArray 设置为 true。

因此,对于您的 10,000 字节文件:

BitArray ba = new BitArray(10000);

// Visited offset, mark in the BitArray            
ba[4] = true;
于 2012-07-13T16:48:31.870 回答
1

听起来您在开始转移时知道以下内容:

  1. 最终文件的大小。
  2. 您打算用于文件的(最大)流数。

创建输出文件并分配所需的空间。

使用相关文件名创建第二个“控制”文件,例如添加您自己的扩展名。在该文件中维护与网络流相对应的流状态结构数组。每个状态都由起始偏移量和传输的字节数组成。定期刷新流缓冲区,然后更新控制文件以反映取得和提交的进度。

主题变化:

  • 控制文件可以定义要传输的段,例如 16MB 块,并由寻找不完整段和从中检索它的合适服务器的线程视为工作队列。
  • 控制文件可以是结果文件中的一个单独的分支。(我在开玩笑吗?)
于 2012-07-13T20:17:04.497 回答
0

在您的文件中实现一个文件系统(如在磁盘上) - 只需使用一些简单的东西,应该是 FOS 领域中可用的东西

于 2012-07-13T16:47:23.917 回答