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

如何忽略UnauthorizedAccessException并保持程序运行?

解决UnauthorizedAccessException导致程序终止的问题

首先明确一点:没有办法绕过系统权限限制去读取无访问权限的文件,但我们完全可以让程序跳过这些文件,继续处理其他有权限的内容——核心问题大概率是你try-catch块的位置放错了!

你之前的程序终止,应该是把try-catch放在了整个文件遍历逻辑的外层(比如整个foreach循环或者Directory.GetFiles外面),这样一旦某个文件抛出异常,整个循环就会被中断,程序进入catch块后就直接结束了。正确的做法是:把try-catch放在单个文件的读取操作周围,让单个文件的异常不会影响整个遍历流程。

示例代码:单个目录文件遍历

using System;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        string targetPath = @"C:\Your\Target\Directory";
        
        // 遍历目录下的所有文件
        foreach (var filePath in Directory.GetFiles(targetPath))
        {
            try
            {
                // 尝试读取文件内容
                string content = File.ReadAllText(filePath);
                // 这里写你的文件处理逻辑
                Console.WriteLine($"成功读取:{filePath}");
            }
            catch (UnauthorizedAccessException ex)
            {
                // 捕获权限异常,输出提示后跳过当前文件
                Console.WriteLine($"跳过无权限文件:{filePath},错误信息:{ex.Message}");
                // 这里的continue可选,因为catch块执行完后会自动进入下一次循环
                continue;
            }
            catch (Exception ex)
            {
                // 可以额外捕获其他可能的异常(比如文件被占用、路径不存在等)
                Console.WriteLine($"处理文件{filePath}时出错:{ex.Message}");
            }
        }
        
        Console.WriteLine("文件遍历完成");
    }
}

示例代码:递归遍历子目录

如果需要遍历子目录,还要注意目录本身也可能触发权限异常,这时候递归调用时也要加try-catch:

using System;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        string rootPath = @"C:\Your\Root\Directory";
        ProcessDirectory(rootPath);
        Console.WriteLine("所有目录遍历完成");
    }

    static void ProcessDirectory(string directoryPath)
    {
        try
        {
            // 处理当前目录下的文件
            foreach (var filePath in Directory.GetFiles(directoryPath))
            {
                try
                {
                    string content = File.ReadAllText(filePath);
                    Console.WriteLine($"成功读取:{filePath}");
                }
                catch (UnauthorizedAccessException ex)
                {
                    Console.WriteLine($"跳过无权限文件:{filePath},错误:{ex.Message}");
                }
            }

            // 递归处理子目录
            foreach (var subDirPath in Directory.GetDirectories(directoryPath))
            {
                try
                {
                    ProcessDirectory(subDirPath);
                }
                catch (UnauthorizedAccessException ex)
                {
                    Console.WriteLine($"跳过无权限目录:{subDirPath},错误:{ex.Message}");
                }
            }
        }
        catch (UnauthorizedAccessException ex)
        {
            Console.WriteLine($"无法访问目录:{directoryPath},错误:{ex.Message}");
        }
    }
}

关键总结

  • 权限限制是系统级的,无法强行读取无权限的文件,只能选择跳过。
  • 把try-catch放在单个文件/目录的操作逻辑内部,而不是整个遍历流程的外层,这样单个异常只会中断当前文件的处理,不会终止整个程序。
  • 针对性捕获UnauthorizedAccessException,避免捕获所有异常导致隐藏其他问题。

内容的提问来源于stack exchange,提问作者RedstoneUmbreon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:54:45