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

UWP应用下载PDF至LocalFolder后文件0KB无法打开问题求助

解决UWP BackgroundTransfer下载PDF后文件0KB的问题

嘿,我帮你捋捋这个问题——你用BackgroundTransfer下载PDF到LocalFolder却得到0KB文件,大概率是下载流程没走完整,或者几个关键步骤漏掉了。先看你贴的代码,只写到创建Uri的部分,完整的下载流程还缺不少环节呢。

下面是具体的排查点和修复方案:

1. 先确保你的Uri是完整有效的

你贴的Uri是截断的:http://www.sachsen.schule/~goethe-gym-auerbach/vplan/VertretungsplanM...,这肯定不行。先去浏览器里打开完整的PDF链接,确认能正常下载,排除链接失效、需要登录或者资源不存在的问题。

2. 完整的BackgroundTransfer下载流程

你需要完成「创建目标文件→初始化下载任务→等待下载完成」的完整流程,而不是只创建Uri就完事。这里给你一个可运行的完整示例代码:

using System;
using System.Diagnostics;
using Windows.Networking.BackgroundTransfer;
using Windows.Storage;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

private async void Button_Click(object sender, RoutedEventArgs e)
{
    try
    {
        // 替换成你的完整PDF链接
        Uri sourceUri = new Uri("http://www.sachsen.schule/~goethe-gym-auerbach/vplan/VertretungsplanM.pdf");
        StorageFolder localFolder = ApplicationData.Current.LocalFolder;
        
        // 从Uri提取文件名,或者自定义文件名
        string fileName = System.IO.Path.GetFileName(sourceUri.LocalPath);
        // 替换已存在的同名文件,避免保留旧的0KB文件
        StorageFile targetFile = await localFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);

        // 初始化下载器和下载任务
        BackgroundDownloader downloader = new BackgroundDownloader();
        DownloadOperation download = downloader.CreateDownload(sourceUri, targetFile);

        // 可选:添加进度回调,实时监控下载状态
        Progress<DownloadOperation> progressCallback = new Progress<DownloadOperation>(DownloadProgress);
        Debug.WriteLine("开始下载PDF文件...");

        // 等待下载完成(关键!没这步会直接跳到下一步,文件还没下载完)
        await download.StartAsync().AsTask(progressCallback);

        // 下载完成后验证文件大小
        var fileProps = await targetFile.GetBasicPropertiesAsync();
        Debug.WriteLine($"下载完成!文件大小:{fileProps.Size} 字节");
    }
    catch (Exception ex)
    {
        Debug.WriteLine($"下载出错:{ex.Message}");
        // 这里可以添加错误提示给用户,比如网络异常、资源不存在等
    }
}

private void DownloadProgress(DownloadOperation download)
{
    BackgroundTransferProgress progress = download.Progress;
    double downloadPercent = progress.TotalBytesToReceive > 0 
        ? (double)progress.BytesReceived / progress.TotalBytesToReceive * 100 
        : 100;
    Debug.WriteLine($"当前进度:{downloadPercent:F2}% | 已接收:{progress.BytesReceived}字节 | 总大小:{progress.TotalBytesToReceive}字节");
}

3. 额外排查点

  • 权限问题:LocalFolder是应用的私有目录,默认拥有读写权限,所以这方面大概率没问题,但如果是下载到其他目录(比如Documents),需要在清单文件中声明对应的权限。
  • 后台下载状态:如果应用被挂起,BackgroundTransfer会继续在后台运行,但你需要监听下载完成事件(比如用BackgroundDownloader.GetCurrentDownloadsAsync()获取未完成的任务)。不过如果是前台点击按钮下载,用await download.StartAsync().AsTask()等待完成就足够了。
  • 异常捕获:一定要捕获异常,很多时候0KB文件是因为下载过程中出错(比如网络断开、资源404),但你没处理异常,导致文件只创建了空壳。

如果按照上面的步骤操作后还是有问题,可以打印download.Status的值,看看下载任务是失败、暂停还是其他状态,进一步定位问题。

内容的提问来源于stack exchange,提问作者brullsker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:32:14