【问题标题】:Having trouble searching all files for a file with a specific name在所有文件中搜索具有特定名称的文件时遇到问题
【发布时间】:2018-04-02 21:18:38
【问题描述】:
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)
    {

    }
}

看起来很简单,除了我不断收到System.unauthorizedaccessexception

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

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

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

我没有解决我的问题无法使用 linq 语句

foreach(DriveInfo d in DriveInfo.GetDrives().Where(x => x.IsReady == true))
                    {

                        Stack<DirectoryInfo> dirstack = new Stack<DirectoryInfo>();

                        dirstack.Push(new DirectoryInfo(d.RootDirectory.ToString()));

                        while(dirstack.Count > 0)
                        {
                            DirectoryInfo current = dirstack.Pop();

                            foreach (DirectoryInfo di in current.GetDirectories())
                            {
                                if((di.Attributes & FileAttributes.System) != FileAttributes.System)
                                {
                                    dirstack.Push(di);
                                }
                            }


                            foreach (FileInfo f in current.GetFiles())
                            {
                                if (f.Name == fileName)
                                {
                                    fList.Add(f);
                                }
                            }
                        }

我正在尝试下面的 cmets 中的那个,但是一旦我点击了

var dirs = di.EnumerateDirectories();

它正在抛出 System.UnauthorizedAccessException。如果我有操纵能力,我什至没有阅读能力。是我对正在发生的事情的猜测。

【问题讨论】:

标签: c# linq directoryinfo


【解决方案1】:
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();

更新 试试这个递归方法。在stackoverflow上的某个地方找到。这将捕获并继续保留。

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

【讨论】:

  • System.UnauthorizedAccessException: '访问路径 'B:\$RECYCLE.BIN\S-1-5-21-745477385-3434684888-2944739576-1003' 被拒绝。'
  • 您应该以管理员身份运行您的 Visual Studio。试试看,让我知道
  • 我添加了 !f.attributes.hasflag(fileAttributes.hidden) 没有帮助是因为我也需要 FOLDER 属性吗?
  • 以管理员身份运行,这次我收到 System.UnauthorizesAccessException。拒绝访问路径 B:\System Volume Information。然后我得到一个 Visual Studio 弹出窗口说遇到异常这可能是由扩展引起的。您可以在 appdata roaming activitylog.xml 中获取更多信息
  • 这段代码的目的是什么?如果我们无法读取特定文件或文件夹,我们应该跳过吗?
猜你喜欢
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 2014-04-26
  • 2014-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多