Получите все файлы .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

Проблема с вышеуказанным запросом в том, что иногда он не извлекает мгновенно созданные файлы.

0
user3366358 7 Мар 2014 в 01:14
Можете ли вы привести пример или понимание того, как это возможно?
 – 
user3366358
7 Мар 2014 в 01:18
Нравится этот вопрос?
 – 
Edgar Carvalho
7 Мар 2014 в 01:19

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

Это вернет каждый файл в доступном каталоге, который содержит фразу «ошибки» в имени файла.

0
Neil Smith 7 Мар 2014 в 06:11
Некоторые папки, такие как «Документы и настройки», выдают ошибку с UnauthorizedAccessException. Как это исправить?
 – 
user3366358
7 Мар 2014 в 02:40
Вы хотите игнорировать папки, к которым у вас нет доступа? Или вы все еще хотите искать среди них?
 – 
Neil Smith
7 Мар 2014 в 02:43
Я хочу выполнить поиск по всем папкам, если это возможно.
 – 
user3366358
7 Мар 2014 в 05:17
Я действительно не знаю, как искать файлы, к которым у вас нет доступа. Я уверен, что вы можете настроить приложение так, чтобы оно всегда запускалось от имени администратора. Я попробовал ответ Йохая Тиммера здесь, но закончил с большим количеством проблем. Я редактирую свой ответ с помощью рекурсивной функции, которую я написал, чтобы получить все доступные файлы. Я знаю, что это не идеально для тебя, но это все, что у меня есть сейчас. Я продолжу думать об этом, когда вернусь домой, так что, возможно, я придумаю что-нибудь позже.
 – 
Neil Smith
7 Мар 2014 в 06:01
Большое спасибо за вашу постоянную помощь. GetAllAccessibleFiles не распознается в моем коде. Вы имели в виду GetAllAccessibleFiles как SearchAccessibleFiles? Я хочу получить файлы со всех дисков с компьютера, и мне нужно получить более одного расширения, например «.doc», «.pdf». Пожалуйста, помогите. Большое спасибо за вашу помощь и время заранее.
 – 
user3366358
7 Мар 2014 в 06:35

Я использую следующий код, чтобы получить все .doc на C :. Его можно изменить для поиска строки, указанной пользователем. Вы можете просто использовать это, а затем перебрать filePaths в поисках указанной пользователем строки.

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

Изменить: конечно, это устраняет необходимость в запросе wmi.

1
marc_s 31 Май 2014 в 23:12
Я пробовал этот маршрут, и он не работает. Если у меня 500 документов на диске C, это займет вечность :(
 – 
user3366358
7 Мар 2014 в 01:49
Ну, трудно получить текущие результаты, не делая этого таким образом. Может быть, настроить индексированную базу данных? Неа. Возможно, ограничить поиск, исключить C:\Windows и т.д.
 – 
riki-oh
7 Мар 2014 в 02:22
Почему бы не запустить этот поиск сразу же в другом потоке и не подготовить результаты для пользователя, чтобы он мог заполнить данные и отправить?
 – 
Nick H.
7 Мар 2014 в 03:50