local function FindCallBack(sCurrentPath) -- Если путь длинный, укорачиваем его StatusDlg.SetStatusText(String.AbbreviateFilePath(sCurrentPath, 48)); -- local bCancelled = StatusDlg.IsCancelled(); return not bCancelled; -- Возвращаем отрицание состояния нажатости кнопки. Это значит что если нажата кнопка отмены останавливаем текущую операцию, если нет, то продолжаем end -- Настраиваем и показываем диалог статуса StatusDlg.ShowCancelButton(true, "Отмена"); StatusDlg.SetAutoSize(false); StatusDlg.SetTitle("Поиск файлов"); StatusDlg.SetMessage("Поиск файлов"); StatusDlg.SetStatusText(""); StatusDlg.SetCancelled(false); StatusDlg.Show(nil, false); -- local tDrives = Drive.Enumerate(); local nCount = Table.Count(tDrives); -- Начина с Lua 5.1 (AMS 8+) можно использовать следующий синтаксис: local nCount = #tDrives; local tPaths = {}; -- Таблица, где будут пути ко всем найденным файлам. for i = 1, nCount do -- Путь к диску local sDriveLetter = tDrives[i]; -- Получаем инофрмацию о диске local nDriveType = Drive.GetType(sDriveLetter); local nDriveSize = Drive.GetSize(sDriveLetter); -- Проверяем диск. Вполне можно использовать константы, не нужно писать сами числа. И такой тии проверки выглядит более компактным. Конечно, можно придумать ещё вариантоы. local bValidDrive = (nDriveSize > 0) and (nDriveType == DRIVE_REMOVABLE or nDriveType == DRIVE_FIXED or nDriveType == DRIVE_REMOTE or nDriveType == DRIVE_RAMDISK); -- если диск отвечает критериям if bValidDrive == true then StatusDlg.SetTitle(string.format("Поиск файлов на \"%s\"", sDriveLetter)); --[[ -- Вот это вот хрень какая-то. В tDrives[x] уже находится нужная буква диска. -- формируем каталог для поиска, выковырнув букву диска и прилепив к ней слэш drv_label = String.Left(Drive.GetInformation(tDrives[x]).DisplayName, String.Length(Drive.GetInformation(tDrives[x]).DisplayName) - 1); drv_label = String.Right(drv_label, 2) .. "\\"; --]] ---------------------------------------------------------------------- --[[ serch = File.Find(drv_label, "искомый файл", true, false, nil, nil); -- Список найденных файлов сохраняется в переменную serch, а на существование проверяется search_results, которая не определена и равна nil и, соответственно, условие не будет выполнено. if (search_results ~= nil) then for index, path in pairs(serch) do sInstPath = sInstPath..path.."\r\n"; end end --]] local tFiles = File.Find(sDriveLetter, "AutoRun.inf", true, false, FindCallBack, nil); if tFiles ~= nil then -- Проходим по списку найденных файлов for x, y in ipairs(tFiles) do -- Добавляем все найденные файлы в таблицу найденныхё tPaths[#tPaths+1] = y; end end -- Останавливаем поиск, если была нажата кнопка отмены if StatusDlg.IsCancelled() == true then break; end end end -- Скрываем диалог статуса StatusDlg.Hide(); -- Если нужна строка со списокм файлов, то можно сделать так local sFoundFiles = table.concat(tPaths, "\r\n"); Dialog.Message("", sFoundFiles); |