File.Find

table File.Find ( string Folder,
string Filename,
boolean Recurse = false,
boolean IncludeFolders = false,
function CallbackFunction = nil,
function FileFoundCallbackFunction = nil )
Примеры

Описание

Поиск файлов в локальной системе.

Параметры

Folder

(строка) Путь к папке, где нужно провести поиск.

Filename

(строка) Имя файла, который нужно найти. Для поиска файлов, что соответствуют указанному шаблону, в этом поле можно использовать подстановочные знаки * и ?.

Recurse

(логический) Делать ли рекурсию вложенных папок во время поиска:

ЗНАЧЕНИЕ
VALUE
ОПИСАНИЕ
DESCRIPTION
trueРекурсия.
falseНет рекурсии. (По умолчанию)

IncludeFolders

(логический) Включать ли (в результат) все пути к папкам, что встретились во время поиска файла.

CallbackFunction

(функция) Имя функции, которая будет вызываться всякий раз, когда происходит процесс поиска. (Эту возвращающуюся функцию можно использовать для отображения хода выполнения операции поиска, своим собственным способом.)

Примечание: Если в CallbackFunction установлено значение nil, тогда информация о протекании процесса будет отправлена во встроенное диалоговое окно состояния, предполагая что оно в настоящий момент видимое. (Можно показать или скрыть диалоговое окно состояния действиями StatusDlg.Show или StatusDlg.Hide соответственно.)

Возвращающаяся функция должна иметь возможность принять следующие параметры:

CurrentPath

(строка) Текущий путь поиска. Возвращающая функция должна возвращать логическое значение (истина (true) или ложь (false)), показывающее следует ли продолжать операцию поиска:

ЗНАЧЕНИЕ
VALUE
ОПИСАНИЕ
DESCRIPTION
trueПродолжать операцию поиска.
falseОстановить операцию поиска, как только это станет возможным.

FileFoundCallbackFunction

(функция) Имя функции, которая будет вызываться всякий раз, когда будет найден файл, соответствующий критериям поиска. Можно использовать эту функцию для выхода из операции поиска, основываясь на нахождении файла; например, если нужно выйти из поиска после нахождения первого файла. Возвращающаяся функция должна иметь возможность принять следующие параметры:

FoundPath

(строка) Путь к найденному файлу. Возвращающая функция должна возвращать логическое значение (истина (true) или ложь (false)), показывающее следует ли продолжать операцию поиска:

ЗНАЧЕНИЕ
VALUE
ОПИСАНИЕ
DESCRIPTION
trueПродолжать операцию поиска.
falseОстановить операцию поиска, как только станет возможно.

Возврат

ResultVariable

(таблица) Таблица, содержащая пути ко всем найденным файлам. Если нет найденных файлов или происходит ошибка, возвращается значение nil. Можно использовать Application.GetLastError для определения случился ли отказ в работе этого действия и почему.

Примечание: Если параметр IncludeFolders установлен как истина (true), результат всегда будет включать папки, которые встречались при поиске.

При добавлении действия из редактора скрипта, можно использовать это поле для определения переменной, которая возвращает значение, сохраняющееся в ней.
Смотрите также: Связанные действия

Примеры

Пример 1

Oggs = File.Find(_SourceFolder, "*.ogg", true, false, ShowSearchProgress, nil);
Ищем файлы Ogg Vorbis внутри папки, откуда работает приложение и сохраняем их пути в таблице по имени Oggs. Так как параметр Recurse установлен как истина, действие будет вести поиск внутри вложенных папок. Функция по имени ShowSearchProgress будет вызываться всякий раз, при выполнении операции поиска.

Пример 2

found = File.Find(Shell.GetFolder(SHF_MYDOCUMENTS), "*.pdf", true, false);
if (found) then
    Dialog.Message("Found one!", "The first PDF file found was:" .. found[1]);
end
Ищем файлы PDF везде внутри папки пользователя Мои документы и сохраняем пути ко всем найденным PDF файлам в таблице по имени "found". Затем, в примере проверяется эта таблица, есть ли в ней хоть какие-то файлы (если их нет, она была бы установлена в ноль (ничто - nil) действием File.Find), и если они существуют, выводим диалоговое окно сообщения, чтобы показать путь к первому найденному PDF файлу.

Пример 3

directory_structure = File.Find(Shell.GetFolder(SHF_MYDOCUMENTS), "*.*", true, true);
Поиск любых файлов внутри папки пользователя Мои документы. Так как параметры Recurse и IncludeFolders установлены как истина, действие будет вести поиск во вложенных папках и будет возвращать все найденные файлы, также как и все папки, что встретились при поиске.

Пример 4

-- Gets the path to the user's My Documents folder.
-- Получаем путь к папке пользователя Мои документы.
my_docs_path = Shell.GetFolder(SHF_MYDOCUMENTS);

-- Check to see if the My Documents folder detection was successful.
-- Проверяем, нашлась ли папка Мои документы.
if (Application.GetLastError() == 0)then

    -- Search the user's My Documents folder for the file "Data.ini".
    -- Ищем в папке пользователя Мои документы файл "Data.ini".
    search_results = File.Find(my_docs_path, "Data.ini", true, false, nil, nil);

    -- Check to see if an error occurred during the search. If it did, display the error message.
    -- Смотрим, не было ли ошибки при поиске. Если это случилось, показываем сообщение об ошибке.
    error = Application.GetLastError();
    if error ~= 0 then
        Dialog.Message("Error",_tblErrorMessages[error]);
    else

        -- If no files were found, notify the user.
        -- Если нет найденных файлов, уведомляем пользователя.
        if (search_results == nil) then
            Dialog.Message("Notice", "Data.ini was not found in your My Documents folder.");

        -- If files were found, display a dialog containing a list of their locations.
        -- Also ask for deletion confirmation.
        -- Если файлы были найдены, показываем диалоговое окно со списком их размещения.
        -- Также запрашиваем подтверждение на удаление.
        else
            message = "Data.ini was found in the following location(s). Click OK to delete the file(s):\r\n\r\n";
            for index, path in pairs(search_results) do
                message = String.Concat(message, path .. "\r\n");
            end
            proceed = Dialog.Message("File Search Results", message, MB_OKCANCEL, MB_ICONQUESTION, MB_DEFBUTTON1);

            -- If the user clicked OK, delete all of the files found.
            -- Если пользователь кликает OK, удаляем все найденные файлы.
            if proceed == IDOK then

                -- Delete each file found in the search.
                -- Удаление каждого, найденного при поиске, файла.
                for index, path in pairs(search_results) do
                    File.Delete(path, false, false, false, nil);

                    -- Check to see if any errors occurred during the deletion.
                    -- Смотрим, не было ли ошибки при удалении.
                    if (Application.GetLastError() ~= 0) then
                        Dialog.Message("Error", "The file located at: " .. path .. " could not be deleted.");
                    end
                end
            end
        end
    end
end
В этом примере действие File.Find используется для поиска всех копий указанного файла INI в папке пользователя Мои документы. Если файл найден более чем в одном месте, представляем пользователю список и спрашиваем его, хочет ли он удалить их. Если он согласен, удаляем каждую копию при помощи действия File.Delete.

Пример 5

-- Callback function, used when a match is found
-- Возвращающаяся функция, используемая при найденном совпадении
function found (filename)
    -- Display a dialog to the user
    -- Показываем диалоговое окно пользователю
    Dialog.Message("FOUND!!", filename .. " was found!!\r\nNow terminating find . . .");
    -- return false (end the find action)
    -- возвращаем ложь (false) (конец действия поиска)
    return false;
end

-- Show the status dialog
-- Показываем диалоговое окно состояния
StatusDlg.Show();

-- Find any filename containing 'win'. Call function 'found' whenever a match is found
-- Ищем любое имя файла, содержащее 'win'. Вызываем функцию 'found' всякий раз, когда совпадение найдено
File.Find("c:\\", "*win*.*", true, false, nil, found);

-- Hide the status dialog
-- Скрываем диалоговое окно состояния
StatusDlg.Hide();
В этом примере ведется поиск файлов, в чьем имени содержится 'win', на всем жестком диске компьютера пользователя. Когда находится совпадение, вызывается функция 'found', и поиск заканчивается. Используя вышеуказанный способ, действие File.Find может заканчиваться как только найдено одно совпадение, несмотря на то, сколь много совпадений существует в месте поиска.

Пример 6

g_FolderSize = 0;

-- This function determines the size of a file and adds it to the total.
-- This function is used as the callback function for the File.Find action in this example.
-- Эта функция определяет размер файла и добавляет его к общему размеру.
-- В этом примере эта функция используется в качестве возвращающейся функции для действия File.Find.
function OnFileFound(Path)
    local nSize = File.GetSize(Path);
    g_FolderSize = g_FolderSize + nSize;
    return true;
end

-- Allow the user to browse for a folder whose size they want.
-- Позволяем пользователю просмотреть папку, чей размер ему понадобился.
local strFolder = Dialog.FolderBrowse("Find a folder", Shell.GetFolder(SHF_MYDOCUMENTS));

StatusDlg.Show();
tblFiles = File.Find(strFolder, "*.*", true, false, nil, OnFileFound);
StatusDlg.Hide();
Dialog.Message("Size", String.GetFormattedSize(g_FolderSize));
В этом примере вычисляется общий размер содержимого выбранной папки. Для этого, действие File.Find вызывается с возвращающейся функцией по названию "OnFileFound".
Смотрите также: Связанные действия