Получите все файлы .doc, существующие на «Мой компьютер», с помощью поискового запроса, заданного пользователем. Я попытался запросить каталог каталога systemindex, и проблема в том, что он не загружает документы, которые были недавно добавлены.
Мой код как ниже
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
Проблема с вышеуказанным запросом в том, что иногда он не извлекает мгновенно созданные файлы.
2 ответа
Я бы использовал класс Directory .net.
var files = Directory.GetFiles(path, "*.doc", SearchOptions.AllDirectories)
.Where(m => m.Contains(yourSearchTerm));
Это вернет все файлы .doc в каталоге по указанному вами пути, которые содержат заданный поисковый запрос. Если он слишком медленный, я бы попытался ограничить его работу на всем диске c.
Более подробную информацию о классе Directory можно найти здесь
Более подробную информацию о методе Enumerable Where можно найти здесь
Изменить: для обработки исключений 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");
Это вернет каждый файл в доступном каталоге, который содержит фразу «ошибки» в имени файла.
Я использую следующий код, чтобы получить все .doc на C :. Его можно изменить для поиска строки, указанной пользователем. Вы можете просто использовать это, а затем перебрать filePaths в поисках указанной пользователем строки.
string myPath = @"C:\";
string[] filePaths = Directory.GetFiles(myPath, "*.doc",SearchOption.AllDirectories);
Изменить: конечно, это устраняет необходимость в запросе wmi.
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.