【问题标题】:How to search files in "Program files" Folder with C#?如何使用 C# 在“程序文件”文件夹中搜索文件?
【发布时间】:2021-04-08 11:39:02
【问题描述】:

无论我是否以管理员身份运行应用程序,在尝试搜索“程序文件”文件夹中的特定文件时,我总是会收到 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 文件时引发异常。

非常感谢任何帮助。

【问题讨论】:

  • 哪一行抛出异常?是 GetFolderPath、GetFiles 还是其他地方?
  • Program Files 文件夹本身和许多子文件夹受系统保护。当 GetFiles 尝试读取有关该文件夹中安全条目的信息时,它无法避免异常。
  • 如前所述,它的 GetFiles() 函数会引发异常。其实我只需要第一级,没有更多的子文件夹。除了 GetFiles() 还有其他方法吗?

标签: c# exception getfiles


【解决方案1】:

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

【讨论】:

【解决方案2】:

这是最终的解决方案。如果您觉得这个问题总体上很有用,请善待并将这个问题评为有帮助。感谢所有帮助过的人。

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();
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-10
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    相关资源
    最近更新 更多