检索我的电脑中存在的用户提供的搜索字词的所有.doc文件。可能吗?

问题描述:

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

我的代码是像下面

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 

上述查询的问题在于,它有时不能立即获取创建的文件。

+4

是的它可能的 –

+0

你可以举一些例子或洞察它是如何可能的吗? – user3366358

+0

像[这个问题](http://*.com/questions/929276/how-to-recursively-list-all-the-files-in-a-directory-in-c)? –

我会使用.net的目录类。

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"); 

这将返回中的每个文件包含在文件名中的短语“错误”的访问的目录。

+0

像Documents&Settings之类的某些文件夹会抛出UnauthorizedAccessException错误,该如何解决? – user3366358

+0

是否要忽略您还没有权限访问的文件夹?或者您还想要搜索吗? –

+0

如果可能,我想搜索所有文件夹。 – user3366358

我使用下面的代码来获取C:上的所有.doc。可以修改它以搜索用户指定的字符串。你可以使用这个,然后通过filePaths循环,寻找你的用户指定的字符串。

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

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

+0

我试过这条路线,但没有解决问题。如果我在我的C盘中有500个文件,它会永久存在:( – user3366358

+0

那么,如果不这样做就很难获得最新的结果,可能是设置了一个索引数据库?Nah。也许限制搜索,排除C:\ Windows等。 –

+0

为什么不尽快在另一个线程中关闭此搜索,并让结果准备好供用户填写数据并提交? –