如何使用 C# 在“程序文件”文件夹中搜索文件?

问题描述

无论我是否以管理员身份运行应用程序,当我尝试在“程序文件文件夹中搜索特定文件时,总是会遇到 System.UnauthorizedAccessException 异常。

代码如下,异常发生在System.IO.Directory.GetFiles(..)

        //--- Find folders Application path
        {
        try
            {
                string searchfile = "terminal64.exe";
                string searchdir = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
                string[] files = System.IO.Directory.GetFiles(searchdir,searchfile,System.IO.SearchOption.AllDirectories);

                for (int i = 0; i < files.Length; i++)
                {
                    string result = files[i];
                    int p=result.IndexOf(searchfile);
                    if (p>0)
                    {
                        result = result.Substring(0,p);
                        AddTargetFolder(result);
                    }
                }
                    
            }
        catch
            {

            }
        }

我使用的是 Visual Studio 2019。在调试器(VS 以管理员身份执行)以及执行最终 .exe 文件时抛出异常。

非常感谢任何帮助。

解决方法

我会将 GetFiles 移动到 try-catch 块中,如果它是 UnauthorizedAccessException,我会忽略它并继续。

,

最终的解决方案来了。如果您觉得它对一般人有用,请善待并评价这个问题有帮助。感谢所有帮助过的人。

using System;
using System.IO;
using System.Management;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    public static class FileDirectorySearch
    {
        public static IEnumerable<string> Search(string searchPath,string searchPattern)
        {
            IEnumerable<string> files = GetFileSystemEntries(searchPath,searchPattern);

            foreach (string file in files)
            {
                yield return file;
            }

            IEnumerable<string> directories = GetDirectories(searchPath);

            foreach (string directory in directories)
            {
                files = Search(directory,searchPattern);

                foreach (string file in files)
                {
                    yield return file;
                }
            }
        }

        private static IEnumerable<string> GetDirectories(string directory)
        {
            IEnumerable<string> subDirectories = null;
            try
            {
                subDirectories = Directory.EnumerateDirectories(directory,"*.*",SearchOption.TopDirectoryOnly);
            }
            catch (UnauthorizedAccessException)
            {
            }

            if (subDirectories != null)
            {
                foreach (string subDirectory in subDirectories)
                {
                    yield return subDirectory;
                }
            }
        }

        private static IEnumerable<string> GetFileSystemEntries(string directory,string searchPattern)
        {
            IEnumerable<string> files = null;
            try
            {
                files = Directory.EnumerateFileSystemEntries(directory,searchPattern,SearchOption.TopDirectoryOnly);
            }
            catch (UnauthorizedAccessException)
            {
            }

            if (files != null)
            {
                foreach (string file in files)
                {
                    yield return file;
                }
            }
        }
    }

    class Program
    {



        static void Main(string[] args)
        {
            //--- Find folders Application path
            {
                try
                {
                    string searchfile = "terminal64.exe";
                    string searchdir = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);

                    IEnumerable<string> filesOrDirectories = FileDirectorySearch.Search(searchdir,searchfile);

                    foreach (string fileOrDirectory in filesOrDirectories)
                    {
                        // Do something here.
                        Console.WriteLine(fileOrDirectory);
                    }
                }
                catch
                {
                    Console.WriteLine("Catch");
                }
                Console.ReadKey();
            }
        }
    }
}