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
相关产品推荐
相关产品推荐

