私は同様のニーズに遭遇し、これが私が思いついたものです. 私の場合、ドキュメント管理システムに送信される特定のファイル拡張子があります。
System.IO を使用して、リストから拡張子を含むディレクトリ内のファイルのリストを取得する 2 つの方法があります。
public IEnumerable<string> DirectoryScan(string directory)
{
List<string> extensions = new List<string>
{
"docx","xlsx","pptx","docm","xlsm","pptm","dotx","xltx","xlw","potx","ppsx","ppsm","doc","xls","ppt","doct","xlt","xlm","pot","pps"
};
IEnumerable<string> myFiles =
Directory.GetFiles(directory, "*", SearchOption.AllDirectories)
.Where(s => extensions.Any(s.EndsWith))
.ToList();
return myFiles;
}`
2 番目の方法では、Windows インデックス検索 Microsoft.Search.Interop を使用します。
public IEnumerable<string> QueryWindowsDesktopSearch(string directory)
{
List<string> extensions = new List<string>
{ "docx","xlsx","pptx","docm","xlsm","pptm","dotx","xltx","xlw","potx","ppsx","ppsm","doc","xls","ppt","doct","xlt","xlm","pot","pps"};
string userQuery = "*";
Boolean fShowQuery = true;
List<string> list = new List<string>();
CSearchManager manager = new CSearchManager();
CSearchCatalogManager catalogManager = manager.GetCatalog("SystemIndex");
CSearchQueryHelper queryHelper = catalogManager.GetQueryHelper();
queryHelper.QueryWhereRestrictions = string.Format("AND (\"SCOPE\" = 'file:{0}')", directory);
if (extensions != null)
{
queryHelper.QueryWhereRestrictions += " AND Contains(System.ItemType,'";
bool fFirst = true;
foreach (string ext in extensions)
{
if (!fFirst)
{
queryHelper.QueryWhereRestrictions += " OR ";
}
queryHelper.QueryWhereRestrictions += "\"" + ext + "\"";
fFirst = false;
}
queryHelper.QueryWhereRestrictions += "') ";
}
string sqlQuery = queryHelper.GenerateSQLFromUserQuery(userQuery);
using (OleDbConnection connection = new OleDbConnection(queryHelper.ConnectionString))
{
using (OleDbCommand command = new OleDbCommand(sqlQuery, connection))
{
connection.Open();
OleDbDataReader dataReader = command.ExecuteReader();
while (dataReader.Read())
{
var file = dataReader.GetString(0);
if (file != null)
{
list.Add(file.Replace("file:", ""));
}
}
}
}
return list;
}
これらのメソッドは両方とも、2 つの結果を取得して比較し、2 つのリストが一致するかどうかを示すブール値を返す別のメソッドから呼び出します。それらが一致しない場合、フォルダは完全にインデックス化されていません。
インデックスが作成されていないフォルダーで QueryWindowsDesktopSearch を呼び出すと、ゼロ ファイルが返されます。これは、フォルダーがインデックスにないことを示すものとして使用できますが、ファイルがインデックスに追加されている可能性がありますが、ファイルのインデックス作成は停止しています。
このようなものを呼び出すことでステータスを確認できます
CSearchManager manager = new CSearchManager();
CSearchCatalogManager catalogManager = manager.GetCatalog("SystemIndex");
_CatalogPausedReason pReason;
_CatalogStatus pStatus;
catalogManager.GetCatalogStatus(out pStatus, out pReason);
pStatus = CATALOG_STATUS_PAUSED および pReason = CATALOG_PAUSED_REASON_USER_ACTIVE のようなものが返される場合があります。
インデックスが実行されていないことがわかります。あなたができる別のことは、次のように呼び出すことです
int incrementalCount, notificationQueue, highPriorityQueue;
catalogManager.NumberOfItemsToIndex(out incrementalCount, out notificationQueue, out highPriorityQueue);
これは、SystemIndex 全体がインデックス作成のためにキューに入れているファイルの数をリストする in plIncrementalCount 値を返します。