You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MonoTorrent下载11GB目录仅生成0字节文件,求技术排查

排查与修复建议

看起来你遇到的问题很典型——小文件下载正常,但大体积目录下载只生成0字节文件,结合你给出的代码,我来帮你排查几个关键问题:

1. 开启文件预分配,解决大文件写入问题

默认的TorrentSettings可能没有开启文件预分配,对于11GB的大文件来说,预分配空间能确保磁盘有足够的位置写入数据,避免出现0字节文件。修改你的TorrentManager初始化代码:

// 替换默认的TorrentSettings,开启预分配
var torrentSettings = new TorrentSettings
{
    PreallocateFiles = true, // 关键:开启文件预分配
    UsePartialFiles = true   // 可选:启用.partial临时文件,避免未完成文件被误识别
};
TorrentManager manager = new TorrentManager(torrent, savePath, torrentSettings);

预分配会在下载前创建对应大小的空文件,确保磁盘空间足够,同时让Torrent引擎能正确写入数据。

2. 修正进度计算逻辑,避免错误判断

你的代码中直接使用manager.Progress赋值给CPBVal,但要注意:manager.Progress的取值范围是0到1(比如50%进度对应0.5),而进度条通常需要0-100的数值,这会导致进度显示异常,甚至可能让你误以为下载没开始。另外,你的进度条判断逻辑用了异或^,这是错误的,应该用逻辑或||:

// 修正进度计算:转换为0-100的百分比
TorrentProcess = Math.Round(manager.Progress * 100, 1); 
CPBVal = TorrentProcess;

// 修正进度条状态判断:只要有进度或下载速度,就取消 indeterminate 状态
if (manager.Progress > 0.0 || engine.TotalDownloadSpeed > 0.0)
{
    CPBIndet = 0;
}

3. 替换阻塞轮询为事件监听,避免线程卡死

你当前用while (_running)的阻塞轮询方式,不仅会占用线程(如果是UI线程还会导致界面卡死),还可能错过Torrent引擎的关键事件(比如文件开始写入、错误触发)。改用TorrentManager的事件监听来处理状态变化:

public void DownloadTorrent(string path)
{
    Torrent torrent = Torrent.Load(path);
    var torrentSettings = new TorrentSettings { PreallocateFiles = true };
    TorrentManager manager = new TorrentManager(torrent, savePath, torrentSettings);
    engine.Register(manager);

    double TorrentSize = Math.Round(manager.Torrent.Size/(1024 * 1024), 1);
    string HashSumm = manager.InfoHash.ToString();
    TProcess = "Проверка мода";

    if (HashSumm != Hash)
    {
        bool _running = true;
        TProcess = "Загрузка мода";
        BTNPlayEn = 0;

        // 监听状态变化
        manager.ManagerStateChanged += (sender, e) =>
        {
            if (e.NewState == TorrentState.Stopped)
            {
                _running = false;
                Version = "Завершено";
                if (manager.Progress >= 1.0)
                {
                    Hash = HashSumm;
                    TProcess = "Готов к запуску";
                    BTNPlayContent = "Играть";
                    BTNPlayEn = 1;
                }
                SetSettings();
            }
        };

        // 监听进度变化
        manager.ProgressChanged += (sender, e) =>
        {
            double TorrentDowload = manager.Monitor.DataBytesDownloaded;
            double TorrentProcess = Math.Round(manager.Progress * 100, 1);
            CPBVal = TorrentProcess;

            if (manager.Progress > 0.0 || engine.TotalDownloadSpeed > 0.0)
            {
                CPBIndet = 0;
            }

            Version = $"Загружено: {Math.Round((TorrentSize * TorrentProcess)/100, 1)}/{TorrentSize} Mb ⇓ {Math.Round(engine.TotalDownloadSpeed / 1024.0, 1)} kB/sec";
        };

        // 监听错误事件,捕获下载异常
        manager.ErrorOccurred += (sender, e) =>
        {
            _running = false;
            TProcess = $"Ошибка загрузки: {e.Message}";
            Version = "Загрузка прервана";
            SetSettings();
        };

        // 启动下载
        manager.Start();
    }
    else
    {
        TProcess = "Готов к запуску";
    }
}

这种方式更高效,也能及时捕获错误,避免阻塞导致的异常。

4. 检查磁盘空间与写入权限

  • 确保savePath所在磁盘有至少11GB的剩余空间,大文件下载前没有空间检查的话,磁盘满了会导致无法写入数据,生成0字节文件。
  • 确认应用程序对savePath目录有写入权限,尤其是Windows系统下的Program Files等受保护目录,可能需要管理员权限才能写入大文件。

5. 验证Torrent文件本身的完整性

先用第三方Torrent客户端(比如qBittorrent)测试这个11GB的Torrent文件,确认能正常下载并生成完整文件。如果第三方客户端也无法下载,说明Torrent文件本身有问题(比如文件列表损坏),需要重新制作或获取正确的Torrent文件。


内容的提问来源于stack exchange,提问作者Константин Герусов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:09:43