UWP应用临时文件夹创建正常,解压ZIP时遇未授权访问异常
嘿,我来帮你搞定这个权限异常的问题!先看看你的代码里的几个小问题,它们正是导致报错的根源:
问题分析
- 错误覆盖了临时文件夹变量:你把原本指向系统临时文件夹的
temporaryFolder重新赋值成了刚创建的子文件夹,虽然这未必直接引发权限问题,但很容易造成后续路径逻辑混乱。 - 不必要的路径拼接操作:
Path.Combine(temporaryFolder.Path, fileName)完全是多余的——CreateFolderAsync的参数只需要子文件夹的名称,不需要完整路径。而且UWP沙盒环境下,直接使用StorageFolder.Path来构建路径,很容易触发权限校验问题。 - 解压操作可能混用了传统IO API:如果你的解压代码用了
System.IO.File这类传统文件操作方法,而不是UWP的StorageFolder/StorageFile异步API,就会因为沙盒权限限制抛出UnauthorizedAccessException。
修正后的代码示例
第一步:正确创建临时子文件夹
// 保留系统临时文件夹的引用,别覆盖它 StorageFolder rootTempFolder = ApplicationData.Current.TemporaryFolder; // 直接从fileName提取无扩展名的字符串作为文件夹名 string targetFolderName = Path.GetFileNameWithoutExtension(fileName); // 在系统临时文件夹下创建子文件夹,用新变量存储结果 StorageFolder targetFolder = await rootTempFolder.CreateFolderAsync( targetFolderName, CreationCollisionOption.ReplaceExisting );
第二步:用UWP API正确解压ZIP
假设你已经获取到了ZIP文件的StorageFile对象,用下面的方式解压就不会触发权限问题:
// 假设zipFile是你的ZIP格式StorageFile using (var zipStream = await zipFile.OpenStreamForReadAsync()) { using (ZipArchive archive = new ZipArchive(zipStream, ZipArchiveMode.Read)) { foreach (ZipArchiveEntry entry in archive.Entries) { if (string.IsNullOrEmpty(entry.Name)) { // 处理压缩包内的子文件夹 await targetFolder.CreateFolderAsync( entry.FullName, CreationCollisionOption.ReplaceExisting ); } else { // 创建文件并写入压缩包内的内容 StorageFile destFile = await targetFolder.CreateFileAsync( entry.FullName, CreationCollisionOption.ReplaceExisting ); using (var entryStream = entry.Open()) using (var fileStream = await destFile.OpenStreamForWriteAsync()) { await entryStream.CopyToAsync(fileStream); await fileStream.FlushAsync(); } } } } }
关键注意点
- UWP的文件操作一定要优先使用
StorageFolder和StorageFile的异步API,尽量避免直接用System.IO里的传统方法,因为沙盒权限是绑定在这些Storage对象上的。 - 不要随意覆盖存储文件夹引用的变量,逻辑清晰的变量命名能帮你避免很多路径相关的错误。
内容的提问来源于stack exchange,提问作者PadloctCZ
相关产品推荐
相关产品推荐

