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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:10:43