UWP Xamarin.Forms检测文件夹存在及创建PDF问题求助
代码错误分析与修正
你的代码存在几个核心问题,直接导致逻辑失效:
1. 逻辑判断完全颠倒
你原本需求是「文件夹不存在就创建,存在则直接使用」,但代码里的if和else逻辑完全搞反:
- 当文件夹不存在时,你调用
GetFolderFromPathAsync尝试获取不存在的文件夹,直接触发异常; - 反而在文件夹存在的
else分支里去创建新文件夹,完全违背预期流程。
2. 错误用文件检测方法判断文件夹
你用File.Exists()判断文件夹是否存在,这是方法误用——File.Exists仅能检测文件,检测文件夹应使用Directory.Exists。更关键的是,UWP处于沙箱环境,直接用System.IO方法访问Downloads目录可能触发权限限制,官方推荐使用UWP原生Storage API操作。
3. 硬编码绝对路径
硬写C:\Users\ALNOOR\Downloads\...这类路径完全不通用,更换用户或设备就会失效,且UWP对沙箱外路径访问有严格限制,硬编码极易触发权限错误。
4. 异步方法使用冗余
get_path里用Task.Run包裹异步方法pathtoget属于多此一举,异步方法直接用async/await语法调用即可,无需额外开线程。
修正后的代码
[assembly: Dependency(typeof(getpathUWP))] namespace ALNahrainAlphaApp.UWP { public class getpathUWP : path { public async Task<string> get_path(string foldername, string filename, byte[] ar) { await pathtoget(foldername, filename, ar); return ""; } private async Task pathtoget(string foldername, string filename, byte[] ar) { StorageFolder targetFolder; // 尝试从下载文件夹获取目标子文件夹 var folderItem = await DownloadsFolder.TryGetItemAsync(foldername); if (folderItem == null || !(folderItem is StorageFolder)) { // 文件夹不存在则创建 targetFolder = await DownloadsFolder.CreateFolderAsync(foldername); } else { // 文件夹已存在,直接使用 targetFolder = folderItem as StorageFolder; } // 创建PDF文件,ReplaceExisting表示文件已存在时覆盖,可按需调整 StorageFile file = await targetFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting); // 使用using确保流自动释放 using (Stream stream = await file.OpenStreamForWriteAsync()) { await stream.WriteAsync(ar, 0, ar.Length); await stream.FlushAsync(); } } } }
修正说明
- 采用UWP原生的
DownloadsFolder.TryGetItemAsync判断文件夹状态,规避权限问题与路径硬编码; - 纠正文件夹判断与创建逻辑,匹配你的需求;
- 用
using包裹文件流,确保资源正确释放; - 添加
CreationCollisionOption.ReplaceExisting处理同名文件场景,避免重复创建时抛出异常; - 简化异步方法调用,移除不必要的线程切换。
内容的提问来源于stack exchange,提问作者rana hd
相关产品推荐
相关产品推荐

