【问题标题】:Retrieve all .doc files exist in My Computer for a search term which user provides. Is it possible?检索“我的电脑”中存在的所有 .doc 文件以查找用户提供的搜索词。是否可以?
【发布时间】:2014-03-06 21:14:02
【问题描述】:

使用用户提供的搜索词检索“我的电脑”中存在的所有 .doc 文件。我曾尝试查询 systemindex catlog,但问题是,它没有获取最近添加的文档。

我的代码如下所示

SELECT "System.ItemName", "System.ItemFolderPathDisplay" FROM "SystemIndex" WHERE CONTAINS(*,'"searchterm"',1033) AND (System.FileName LIKE '%.doc' OR System.FileName LIKE '%.txt') AND Contains(System.Kind, 'document') ORDER BY System.FileName ASC

上述查询的问题是,它有时无法获取即时创建的文件。

【问题讨论】:

  • 你能举一些例子或见解来说明它是如何可能的吗?
  • 喜欢this question?

标签: c# .net c#-4.0 wmi wmi-query


【解决方案1】:

我使用以下代码获取 C: 上的所有 .doc。可以修改为搜索用户指定的字符串。您可以只使用它,然后遍历 filePaths,寻找您的用户指定的字符串。

    string myPath = @"C:\";
    string[] filePaths = Directory.GetFiles(myPath, "*.doc",SearchOption.AllDirectories);

编辑:当然,这消除了对 wmi 查询的需要。

【讨论】:

  • 我已经尝试过这条路线,但没有成功。如果我的 C 驱动器中有 500 个文档,则需要很长时间 :(
  • 嗯,如果不这样做,很难获得当前结果。也许设置一个索引数据库?不。也许限制搜索,排除 C:\Windows 等。
  • 为什么不在另一个线程中立即启动此搜索,并准备好结果供用户填写数据并提交?
【解决方案2】:

我会使用 .net 的 Directory 类。

var files = Directory.GetFiles(path, "*.doc", SearchOptions.AllDirectories)
               .Where(m => m.Contains(yourSearchTerm));

这将返回您提供的路径中包含给定搜索词的目录中的所有 .doc 文件。如果它太慢,我会考虑限制它在整个 c 驱动器上运行。

More info about the Directory class can be found here

More info about Enumerable's Where method can be found here

编辑:要处理 UnauthorizedAccessExceptions,您需要递归执行此操作并单独检查每个目录,以便在您无权访问当前目录时吃掉异常。

IEnumerable<string> SearchAccessibleFiles(string root, string searchTerm) {
    var files = new List<string>();

    foreach (var file in Directory.GetFiles(root)
                             .Where(m => m.Contains(searchTerm))) 
    {
        files.Add(file);
    }
    foreach (var subDir in Directory.GetDirectories(root)) {
        try {
            files.AddRange(GetAllAccessibleFiles(subDir, searchTerm));
        }
        catch (UnauthorizedAccessException ex) {
            // ...
        }
    }

    return files;
} 

并且可以像这样使用:

var files = GetAllAccessibleFiles(@"c:\", "bugs");

这将返回可访问目录中的每个文件,文件名中包含短语“bugs”。

【讨论】:

  • 某些文件夹(如 Documents & Settings)会抛出 UnauthorizedAccessException 错误。如何解决这个问题?
  • 您要忽略您无权访问的文件夹吗?还是你还想搜索它们?
  • 如果可能,我想搜索所有文件夹。
  • 我真的不知道如何搜索你无权访问的文件。我相信您可以将您的应用程序设置为始终以管理员身份运行。我尝试了 Yochai Timmer 的回答 here,但最终遇到了更多问题。我正在使用我编写的递归函数来编辑我的答案,以获取所有可访问的文件。我知道这对你来说并不理想,但这是我现在所拥有的。不过,我回家后会继续考虑这个问题,以便以后想出一些办法。
  • 非常感谢您一直以来的帮助。 GetAllAccessibleFiles 在我的代码中未被识别。您是说 GetAllAccessibleFiles 是 SearchAccessibleFiles 吗?我想从计算机的所有驱动器中获取文件,并且我需要获取多个扩展名,例如“.doc”、“.pdf”,请帮助。非常感谢您提前提供的帮助和时间。
猜你喜欢
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
  • 2022-01-18
  • 2010-10-30
  • 1970-01-01
  • 2015-09-05
相关资源
最近更新 更多