Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法在所有文件中搜索具有特定名称的文件_C#_Linq_Directoryinfo - Fatal编程技术网

C# 无法在所有文件中搜索具有特定名称的文件

C# 无法在所有文件中搜索具有特定名称的文件,c#,linq,directoryinfo,C#,Linq,Directoryinfo,这似乎很简单,只是我一直在获取System.unauthorizedaccessexception 所以我尝试编写一个linq语句来检查所有没有系统标志的文件,并将其返回到列表中 foreach(DriveInfo d in DriveInfo.GetDrives().Where(x => x.IsReady == true)) { try { string[] files = Directory.GetFiles(d.RootDirectory.ToStr

这似乎很简单,只是我一直在获取
System.unauthorizedaccessexception

所以我尝试编写一个linq语句来检查所有没有系统标志的文件,并将其返回到列表中

foreach(DriveInfo d in DriveInfo.GetDrives().Where(x => x.IsReady == true))
{
    try
    {
        string[] files = Directory.GetFiles(d.RootDirectory.ToString(), fileName, SearchOption.AllDirectories);

        foreach(string file in files)
        {
            Console.WriteLine(file);
        }
    }
    catch(exception ex)
    {

    }
}
但它并不完全正确。它也不会检查所有目录。我如何解决我的问题

我没有解决我的问题不能使用linq语句

var folderFound = new DirectoryInfo(d.RootDirectory.ToString())
   .GetFiles()
   .Where(f => !f.Attributes.HasFlag(FileAttributes.System) && f.Name == fileName)
   .Select(f => f.Name)
   .ToList();

它正在抛出System.UnauthorizedAccessException。如果我有操纵的能力,我甚至连阅读的能力都没有。我猜是怎么回事

var dirs = di.EnumerateDirectories();
更新 试试这个递归方法。在stackoverflow的某个地方找到的。这将捕获并继续保留

var folderFound = new DirectoryInfo(d.RootDirectory.ToString())
   .GetFiles("*",SearchOption.AllDirectories)
   .Where(f => !f.Attributes.HasFlag(FileAttributes.System) && f.Name == fileName)
   .Select(f => f.Name)
   .ToList();
公共静态列表GetAllAccessibleFiles(字符串根路径,列表alreadyFound=null)
{
if(alreadyFound==null)
alreadyFound=新列表();
DirectoryInfo di=新的DirectoryInfo(rootPath);
var dirs=di.EnumerateDirectories();
foreach(目录中的目录信息目录)
{
如果(!((dir.Attributes&FileAttributes.Hidden)=FileAttributes.Hidden))
{
alreadyFound=GetAllAccessibleFiles(dir.FullName,alreadyFound);
}
}
var files=Directory.GetFiles(rootPath);
foreach(文件中的字符串s)
{
已找到。添加;
}
返回已找到的文件;
}

System.UnauthorizedAccessException:“对路径“B:\$RECYCLE.BIN\S-1-5-21-745477385-343434684888-2944739576-1003”的访问被拒绝。您应该以管理员身份运行visual studio。”。试试看,让我知道我补充道!f、 attributes.hasflag(fileAttributes.hidden)没有帮助,是因为我也需要文件夹属性吗?以管理员身份运行,这次我收到System.UnauthorizesAccessException。对路径B:\系统卷信息的访问被拒绝。然后我看到一个VisualStudio弹出窗口,说遇到了异常,这可能是由扩展引起的。您可以在appdata roaming activitylog.xml中获得更多信息此代码的目的是什么?如果我们不能阅读特定的文件或文件夹,我们应该跳过吗?可能是重复的,除非这是一个学习练习,有专门做这类事情的工具。签出索引搜索工具。
var folderFound = new DirectoryInfo(d.RootDirectory.ToString())
   .GetFiles("*",SearchOption.AllDirectories)
   .Where(f => !f.Attributes.HasFlag(FileAttributes.System) && f.Name == fileName)
   .Select(f => f.Name)
   .ToList();
public static List<string> GetAllAccessibleFiles(string rootPath, List<string> alreadyFound = null)
    {
        if (alreadyFound == null)
            alreadyFound = new List<string>();
        DirectoryInfo di = new DirectoryInfo(rootPath);
        var dirs = di.EnumerateDirectories();
        foreach (DirectoryInfo dir in dirs)
        {
            if (!((dir.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden))
            {
                alreadyFound = GetAllAccessibleFiles(dir.FullName, alreadyFound);
            }
        }

        var files = Directory.GetFiles(rootPath);
        foreach (string s in files)
        {
            alreadyFound.Add(s);                
        }

        return alreadyFound;
    }