UWP中调用Directory.GetFiles()导致程序崩溃的问题排查
问题分析与修复方案
1. 关于UWP额外的-ServerName命令行参数
这个参数是UWP应用启动时系统自动添加的内部沙箱管理参数,完全不需要处理。解析命令行参数时,直接过滤掉以-ServerName:开头的参数即可,示例代码:
var validArgs = cmdArgs.Where(arg => !arg.StartsWith("-ServerName:")).ToArray();
后续仅处理validArgs中的有效参数即可。
2. Directory.GetFiles崩溃的核心原因与修复
崩溃原因
UWP是沙箱化应用,传统.NET的System.IO.Directory/File系列API仅能访问应用自身的沙箱目录(如ApplicationData.Current.LocalFolder),直接访问外部系统目录会触发权限拒绝异常。由于你的代码在页面构造函数中同步调用该方法,异常被UWP框架捕获后,就会跳转到App.g.i.cs的断点处。
正确修复方案(UWP专属)
UWP中必须使用Windows.Storage命名空间下的异步API访问外部文件/文件夹,同时需配置对应权限:
步骤1:配置应用权限
打开Package.appxmanifest,根据需求添加权限:
- 仅访问图片库:在功能标签下勾选
图片库 - 需访问任意文件夹:勾选
broadFileSystemAccess(注意:该权限需要用户在系统设置中手动开启,且仅适用于桌面设备)
步骤2:修改代码为异步模式
UWP的文件API均为异步设计,不能在构造函数中同步调用,建议在OnNavigatedTo方法中执行初始化逻辑:
namespace Imager_UWP { public sealed partial class MainPage : Page { private string folderPath = ""; private List<StorageFile> imageFiles = new List<StorageFile>(); private int currentIndex = 0; public MainPage() { this.InitializeComponent(); } protected override async void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); await ProcessCommandLineArgs(); await LoadImageFiles(); } private async Task ProcessCommandLineArgs() { var cmdArgs = Environment.GetCommandLineArgs(); var validArgs = cmdArgs.Where(arg => !arg.StartsWith("-ServerName:")).ToArray(); if (validArgs.Length <= 1) return; string fullArg = validArgs.Last(); var file = await StorageFile.GetFileFromPathAsync(fullArg); folderPath = file.Path.Replace(file.Name, ""); } private async Task LoadImageFiles() { if (string.IsNullOrEmpty(folderPath)) return; try { var folder = await StorageFolder.GetFolderFromPathAsync(folderPath); var queryOptions = new QueryOptions(CommonFileQuery.DefaultQuery, new[] { ".jpg", ".jpeg", ".png" }); var fileQuery = folder.CreateFileQueryWithOptions(queryOptions); imageFiles = (await fileQuery.GetFilesAsync()).ToList(); } catch (UnauthorizedAccessException) { await new MessageDialog("无权限访问该文件夹,请检查应用权限设置").ShowAsync(); } } } }
补充:命令行激活的规范处理
如果应用是通过命令行直接启动并传递参数,更规范的方式是在App.xaml.cs中重写OnActivated方法:
protected override async void OnActivated(IActivatedEventArgs args) { if (args is CommandLineActivatedEventArgs cmdArgs) { var commandLine = cmdArgs.Operation.Arguments; var rootFrame = Window.Current.Content as Frame; if (rootFrame == null) { rootFrame = new Frame(); Window.Current.Content = rootFrame; } rootFrame.Navigate(typeof(MainPage), commandLine); Window.Current.Activate(); } }
总结
Directory.GetFiles不适合UWP访问外部目录,必须使用Windows.Storage异步API- UWP命令行参数需过滤系统自动添加的内部参数
- 必须配置对应文件访问权限才能访问外部目录
内容的提问来源于stack exchange,提问作者Nico1395
相关产品推荐
相关产品推荐

