如何解决如何使用 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();
}
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。