2014-03-06 32 views
0

使用用戶提供的搜索詞檢索「我的電腦」中存在的所有.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://stackoverflow.com/questions/929276/how-to-recursively-list-all-the-files-in-a-directory-in-c)? –

回答

0

我會使用.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

1

我使用下面的代碼來獲取C:上的所有.doc。可以修改它以搜索用戶指定的字符串。你可以使用這個,然後通過filePaths循環,尋找你的用戶指定的字符串。

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

編輯:當然,這消除了對wmi查詢的需要。

+0

我試過這條路線,但沒有解決問題。如果我在我的C盤中有500個文件,它會永久存在:( – user3366358

+0

那麼,如果不這樣做就很難獲得最新的結果,可能是設置了一個索引數據庫?Nah。也許限制搜索,排除C:\ Windows等。 –

+0

爲什麼不盡快在另一個線程中關閉此搜索,並讓結果準備好供用戶填寫數據並提交? –

相關問題