Получение списков файлов и папок с FTP-серверов

FTP-клиенту необходим список файлов и папок в текущей папке на FTP-сервере. Он должен содержать как можно больше сведений о файлах и папках (дата, размер, пользователь, группа, права доступа и т. д.). Эти файлы и папки отображаются на панели, где с ними можно работать. Список файлов и папок формируется из текстового списка, полученного с FTP-сервера. Этот список предназначен для чтения человеком, а не для автоматического разбора. Поэтому почти у каждого FTP-сервера свой формат списка (в зависимости от операционной системы сервера, её языка и т. д.), и FTP-клиент должен обрабатывать множество форматов.

Для каждого формата списка определяется один тип сервера. Он содержит условие автоматического определения типа сервера, список доступных столбцов данных (включая их видимость на панели) и анализатор текстового списка. Все определённые типы серверов показаны в Настройка/Серверы. Добавлять новые типы серверов и изменять существующие можно в диалоговом окне Редактирование типа сервера.

Вы можете выбрать, определять ли тип сервера автоматически. Если нет, укажите, какой тип использовать. См. параметр Тип сервера в диалоговом окне Дополнительные параметры.

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

Для разбора текстового списка используется заданный тип сервера. При успешном разборе получается список файлов и папок. В противном случае плагин выводит предупреждение, а на панели отображается только исходный текстовый список (он непригоден для выполнения операций).

Папка "." (если она есть в списке) и папка ".." (если она есть в списке корневой папки) удаляются из списка файлов и папок. Папка "..", если она есть в списке, всегда видима: атрибут "скрытый" игнорируется.

Получение списков файлов и папок с автоматически определённым типом сервера

Все определённые типы серверов проверяются по очереди. Для каждого типа вычисляется условие автоматического определения. Если оно ложно, тип пропускается и проверяется следующий. Если оно истинно, этот тип используется для разбора текстового списка. При успешном разборе получается список файлов и папок. В противном случае тип пропускается и проверяется следующий.

Если ни один тип сервера не позволил успешно разобрать список, по очереди проверяются все типы, пропущенные из-за условия автоматического определения. Каждый из них используется для разбора текстового списка. При успешном разборе получается список файлов и папок. В противном случае тип пропускается и проверяется следующий.

Если ни один определённый тип сервера не позволил разобрать список, плагин выводит предупреждение, а на панели отображается только исходный текстовый список (он непригоден для выполнения операций).

Тип сервера определяется автоматически только для первого списка, полученного с сервера. Для всех остальных списков используется тот же тип, что позволяет плагину показывать одинаковые столбцы даже для пустых списков. Если список не удаётся разобрать с этим типом сервера, плагин пытается автоматически определить другой тип.

Папка "." (если она есть в списке) и папка ".." (если она есть в списке корневой папки) удаляются из списка файлов и папок. Папка "..", если она есть в списке, всегда видима: атрибут "скрытый" игнорируется.

Синтаксис анализатора

Однострочный комментарий начинается с символа "#" и заканчивается символом конца строки.

Каждое правило начинается с символа "*" и заканчивается символом ";". Число правил не ограничено. Правило состоит из функций, разделённых символом ",".

Функция состоит из имени, символа "(", списка параметров и символа ")". Полный список функций приведён далее на этой странице.

Параметры в списке разделяются символом ",". Параметры являются выражениями.

Выражение — это идентификатор столбца, переменная состояния, константа или одна бинарная операция. Бинарная операция имеет стандартный вид (first_operand operation_symbol second_operand). Операндом может быть идентификатор столбца, переменная состояния или константа.

Идентификатор столбца состоит из символа '<', имени идентификатора и символа '>'.

Полные списки переменных состояния и символов операций приведены далее на этой странице.

Константа — это строка, число или логическое значение.

Строка заключается в двойные кавычки (символы '"') и должна быть задана в одной строке. Экранирующие последовательности начинаются с символа '\'. Поддерживаются: "\\" для символа '\', "\"" для символа '"', "\t" для табуляции, "\r" и "\n" для символов конца строки (CR и LF). Другие экранирующие последовательности считаются синтаксическими ошибками.

Число состоит из десятичных цифр. Отрицательное число начинается с символа "-". Положительное число начинается с символа "+", который можно опустить.

Логическое значение — "true" или "false" (без двойных кавычек).

Столбцы

Каждый столбец имеет имя идентификатора, тип значений, пустое значение, имя и описание для отображения на панели и выравнивание значений. Имя идентификатора используется в идентификаторе столбца при присваивании ему значений. В каждом столбце может быть только одно значение для каждого элемента (файла или папки). Если значение не присвоено, используется заданное для столбца пустое значение. Столбец может отображаться на панели или быть скрытым. Только столбцы типов Name и Extension всегда видимы. Столбцы задаются в диалоговом окне Редактирование столбца.

Доступны следующие типы столбцов:

ТипОписание
Имястрока; имя файла или папки; требуется ровно один столбец этого типа; его нельзя скрыть; определение пустого значения для него не имеет смысла; анализатор должен присвоить ему значение для каждого файла и папки; если значение не присвоено, разбор по текущему правилу не добавляет ни файл, ни папку (это используется для пропуска пустых строк и других несущественных частей текстового списка); присваивание пустой строки ("") считается ошибкой разбора
Расширениестрока; расширение файла; значения автоматически формируются из значений столбца типа Name; его нельзя скрыть; определение пустого значения для него не имеет смысла
Размер файла в байтах64-разрядное беззнаковое целое число; размер файла в байтах; для всех папок значение равно нулю и отображается на панели как "DIR"; пустое значение по умолчанию равно нулю
Дата последней записидата; дата последней записи (изменения); значение должно быть допустимой датой, иначе оно заменяется на 1 января 1602 года; пустое значение по умолчанию — 1 января 1602 года
Время последней записивремя; время последней записи (изменения); пустое значение по умолчанию — 0:00:00
Тип файластрока; описание типа файла (определяется Windows по расширению); значения автоматически формируются из значений столбца типа Name; определение пустого значения для этого столбца не имеет смысла
Произвольный текстстрока; общего назначения; пустое значение по умолчанию — пустая строка ("")
Произвольная датадата; общего назначения; значение должно быть допустимой датой, иначе оно заменяется на 1 января 1602 года; пустое значение по умолчанию — пустая строка (""), то есть при отсутствии присвоенного значения на панели ничего не отображается
Произвольное времявремя; общего назначения; пустое значение по умолчанию — пустая строка (""), то есть при отсутствии присвоенного значения на панели ничего не отображается
Произвольное число64-разрядное целое число со знаком; общего назначения; пустое значение по умолчанию — пустая строка (""), то есть при отсутствии присвоенного значения на панели ничего не отображается

Кроме того, есть три виртуальных столбца с идентификаторами <is_dir>, <is_hidden> и <is_link>. Им присваиваются логические значения, означающие соответственно: "этот элемент — папка?" (false означает файл), "этот элемент скрытый?" (false означает отсутствие атрибута "скрытый") и "этот элемент — ссылка?" (false означает, что это не ссылка). Присваивать им значения необязательно; их пустые значения означают "файл", "не скрытый" и "не ссылка".

Синтаксис условия автоматического определения

Условие автоматического определения — логическое выражение. Операторы в нём, от высшего приоритета к низшему: NOT, AND и OR. NOT (логическое отрицание) — унарный оператор, AND (логическое И) и OR (логическое ИЛИ) — бинарные. Выражение может содержать подвыражения в круглых скобках. В качестве операндов используются следующие функции:

ФункцияОписание
syst_contains(string)возвращает true, только если ответ на команду FTP SYST (получение типа операционной системы сервера) содержит указанную строку; поиск без учёта регистра
welcome_contains(string)возвращает true, только если первое сообщение сервера содержит указанную строку; поиск без учёта регистра
reg_exp_in_syst(regular_expression_string)возвращает true, только если ответ на команду FTP SYST (получение типа операционной системы сервера) содержит строку, соответствующую указанному регулярному выражению; поиск без учёта регистра
reg_exp_in_welcome(regular_expression_string)возвращает true, только если первое сообщение сервера содержит строку, соответствующую указанному регулярному выражению; поиск без учёта регистра

Разбор

Разбор считается успешным, если текстовый список полностью пройден с помощью заданных правил.

Текущая позиция в списке называется указателем. Во время разбора указатель перемещается от начала к концу списка.

Правило может быть применено, только если все его функции успешно выполнены, столбцу типа Name не присвоена пустая строка (то есть ему можно присвоить непустую строку или ничего не присваивать), а указатель перемещён в конец какой-либо строки списка. После применения правила указатель всегда перемещается в начало следующей строки списка.

При выполнении функция может перемещать указатель и присваивать или изменять значения в столбцах.

Анализатор может содержать любое необходимое число правил. Правила всегда проверяются в порядке их определения. Иными словами, всегда применяется первое подходящее правило.

Список может быть неполным, если пользователь отменил его передачу или произошёл сетевой сбой. Неполный список обрезается так, чтобы остались только полные строки текста.

Разбор неполного списка обрабатывается на уровне применения правил. В простом случае указатель перемещается с помощью правил в конец неполного списка, что означает успешное завершение разбора. В ином случае при выполнении функции текущего правила указатель должен перейти на следующую строку. Но это невозможно, поскольку список неполон, поэтому разбор успешно завершается (как если бы строка или строки, пройденные текущим правилом, отсутствовали в неполном списке).

Поддерживаемые размеры файлов

Плагин поддерживает два вида размеров файлов: в байтах и в блоках. Размер следует присваивать столбцу типа File Size in Bytes, если он в байтах, либо столбцу типа Any Number со стандартным именем "Blocks" или "BlkSize". Тогда при выделении группы файлов общий размер в байтах или блоках отображается в строке состояния.

Функции разбора

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

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

Примечание: в следующей таблице пробельный символ означает пробел или табуляцию.

Для разбора доступны следующие функции:

ФункцияОписание
if(expression)результат выражения (параметр expression) должен иметь логический тип; функция выполняется успешно, если результат равен true
assign(<column>, expression)тип результата выражения (параметр expression) должен совпадать с типом значений столбца (параметр <column>); присваивает столбцу результат выражения
skip_white_spaces()пропускает все пробельные символы в позиции указателя; перемещает указатель за них, если они есть
skip_to_number()перемещает указатель к ближайшей десятичной цифре
white_spaces()пропускает все пробельные символы в позиции указателя; функция выполняется успешно, только если указатель переместился
white_spaces(number)пропускает строку с заданным количеством (параметр number) пробельных символов в позиции указателя; перемещает указатель за эту строку; функция выполняется успешно, только если такая строка существует
white_spaces_and_line_ends()пропускает все пробельные символы и символы конца строки в позиции указателя; функция выполняется успешно, только если указатель переместился и не находится в конце списка (после пробельных символов и символов конца строки найден какой-либо символ)
rest_of_line()перемещает указатель в конец строки; функция выполняется успешно, только если указатель переместился
rest_of_line(<column>)тип значений столбца (параметр <column>) должен быть строковым; присваивает столбцу строку от позиции указателя до символа конца строки, не включая его; указатель перемещается в конец строки; функция выполняется успешно, только если указатель переместился
word()пропускает все символы, кроме пробельных и символов конца строки; функция выполняется успешно, только если указатель переместился
word(<column>)тип значений столбца (параметр <column>) должен быть строковым; присваивает столбцу строку от позиции указателя до первого пробельного символа или символа конца строки, не включая его; перемещает указатель за эту строку; функция выполняется успешно, только если указатель переместился
number(<column>)тип значений столбца (параметр <column>) должен быть целочисленным; присваивает столбцу десятичное число, начинающееся в позиции указателя; за числом должен следовать обычный разделитель (',', '.', ';', ':' и т. п.), пробельный символ или конец строки, но не буква; перемещает указатель за число; функция выполняется успешно, только если число существует, корректно завершается и, для столбца типа File Size in Bytes, не является отрицательным
positive_number(<column>)тип значений столбца (параметр <column>) должен быть целочисленным; присваивает столбцу положительное десятичное число, начинающееся в позиции указателя; если число отрицательное, присваивает пустое значение по умолчанию (ноль для типа File Size in Bytes, пустую строку для типа Any Number); за числом должен следовать обычный разделитель (',', '.', ';', ':' и т. п.), пробельный символ или конец строки, но не буква; перемещает указатель за число; функция выполняется успешно, только если число существует и корректно завершается
number_with_separators(<column>, string) тип значений столбца (параметр <column>) должен быть целочисленным; присваивает столбцу десятичное число с разделителями групп цифр, начинающееся в позиции указателя (они облегчают чтение больших чисел; допустимые разделители заданы параметром string; разрешены все символы, кроме десятичных цифр, '+' и '-'); за числом должен следовать обычный разделитель (',', '.', ';', ':' и т. п.), пробельный символ или конец строки, но не буква; перемещает указатель за число; функция выполняется успешно, только если число существует, корректно завершается и, для типа File Size in Bytes, не является отрицательным
month_3(<column>)тип значений столбца (параметр <column>) должен быть датой; присваивает столбцу месяц, обозначенный тремя буквами в позиции указателя; поддерживает названия месяцев на нескольких языках (сейчас английский, немецкий, норвежский и шведский); за названием должен следовать обычный разделитель (',', '.', ';', ':' и т. п.), пробельный символ или конец строки, но не буква; перемещает указатель за название месяца; функция выполняется успешно, только если название известно и все названия месяцев в списке относятся к одному языку
month_3(<column>, string)тип значений столбца (параметр <column>) должен быть датой; присваивает столбцу месяц, обозначенный тремя буквами в позиции указателя; использует названия из строки (параметр string), содержащей двенадцать трёхбуквенных названий месяцев через пробел (например, "jan feb mar apr may jun jul aug sep oct nov dec" для английского); за названием должен следовать обычный разделитель (',', '.', ';', ':' и т. п.), пробельный символ или конец строки, но не буква; перемещает указатель за название месяца; функция выполняется успешно, только если название есть в строке
month_txt(<column>)тип значений столбца (параметр <column>) должен быть датой; присваивает столбцу месяц, указанный названием в позиции указателя; поддерживает названия на нескольких языках (сейчас только немецкий); за названием должен следовать обычный разделитель (',', '.', ';', ':' и т. п.), пробельный символ или конец строки, но не буква; перемещает указатель за название месяца; функция выполняется успешно, только если название известно и все названия месяцев в списке относятся к одному языку
month_txt(<column>, string)тип значений столбца (параметр <column>) должен быть датой; присваивает столбцу месяц, указанный названием в позиции указателя; использует названия из строки (параметр string), содержащей двенадцать названий месяцев через пробел (например, "Jan. Feb. März Apr. Mai Juni Juli Aug. Sept. Okt. Nov. Dez." для немецкого); за названием должен следовать обычный разделитель (',', '.', ';', ':' и т. п.), пробельный символ или конец строки, но не буква; перемещает указатель за название месяца; функция выполняется успешно, только если название есть в строке
month(<column>)тип значений столбца (параметр <column>) должен быть датой; присваивает столбцу месяц, заданный десятичным числом в позиции указателя; за числом должен следовать обычный разделитель (',', '.', ';', ':' и т. п.), пробельный символ или конец строки, но не буква; перемещает указатель за число; функция выполняется успешно, только если число находится в диапазоне от 1 до 12
day(<column>)тип значений столбца (параметр <column>) должен быть датой; присваивает столбцу день, заданный десятичным числом в позиции указателя; за числом должен следовать обычный разделитель (',', '.', ';', ':' и т. п.), пробельный символ или конец строки, но не буква; перемещает указатель за число; функция выполняется успешно, только если число находится в диапазоне от 1 до 31
year(<column>)тип значений столбца (параметр <column>) должен быть датой; присваивает столбцу год, заданный десятичным числом в позиции указателя; за числом должен следовать обычный разделитель (',', '.', ';', ':' и т. п.), пробельный символ или конец строки, но не буква; перемещает указатель за число; функция выполняется успешно, только если число находится в диапазоне 0–999 (к значениям 0–79 прибавляется 2000, к значениям 80–999 — 1900; например, год 107 означает 2007) либо 1602–9999
time(<column>)тип значений столбца (параметр <column>) должен быть временем; присваивает столбцу часы, минуты и необязательные секунды и миллисекунды, заданные десятичными числами в позиции указателя; допустимые форматы: 00:00, 00:00:00 или 00:00:00.000; если после времени стоит "a", "am", "p" или "pm", оно считается утренним (a.m.) или вечерним (p.m.) и соответственно корректируется; за временем должен следовать обычный разделитель (',', '.', ';', ':' и т. п.), пробельный символ или конец строки, но не буква или цифра; перемещает указатель за время; функция выполняется успешно, только если время допустимо (диапазоны: 0–23, 0–59, 0–59 и 0–999)
year_or_time(<column_date>, <column_time>) столбцы (параметры <column_date> и <column_time>) должны иметь типы даты и времени; присваивает столбцам год и необязательное время (только часы и минуты), заданные в позиции указателя десятичным числом для года или двумя числами через ":" для времени; поддерживает стандартный формат Unix: если указан год, время неизвестно, а если указано время, год вычисляется по текущей дате так, чтобы полная дата была не старше шести месяцев; за числами должен следовать обычный разделитель (',', '.', ';', ':' и т. п.), пробельный символ или конец строки, но не буква; перемещает указатель за год или время; функция выполняется успешно, только если год или время допустимы (диапазоны: 1602–9999 и 0–23:0–59)
all(number)пропускает заданное количество (параметр number) символов; перемещает указатель за пропущенные символы; функция выполняется успешно, только если все заданные символы были пропущены
all(<column>, number)тип значений столбца (параметр <column>) должен быть строковым; присваивает столбцу строку, начинающуюся в позиции указателя и содержащую заданное число символов (параметр number); перемещает указатель за эту строку; функция выполняется успешно, только если такая строка существует
all_to(string)находит первое вхождение заданной строки (параметр string) без учёта регистра и перемещает указатель за него; функция выполняется успешно, только если строка найдена
all_to(<column>, string)тип значений столбца (параметр <column>) должен быть строковым; присваивает столбцу строку от позиции указателя до конца первого вхождения заданной строки (параметр string), найденного без учёта регистра; перемещает указатель за найденную строку; функция выполняется успешно, только если заданная строка найдена
all_up_to(<column>, string)тип значений столбца (параметр <column>) должен быть строковым; присваивает столбцу строку от позиции указателя до начала первого вхождения заданной строки (параметр string), найденного без учёта регистра; перемещает указатель за найденную строку; функция выполняется успешно, только если заданная строка найдена
unix_link(<is_dir>, <column_name>, <column_link>)столбцы <column_name> и <column_link> должны иметь типы Name и Any Text; работает со строкой от позиции указателя до символа конца строки, не включая его; перемещает указатель за эту строку; ожидает стандартный формат ссылки Unix: "link_name -> target_name" или "link_name", если цель недоступна; извлекает из строки имя ссылки и, при наличии, её цель, а также определяет, ведёт ссылка к файлу или папке (эвристика: если имя или цель ссылки содержат расширение, она, вероятно, ведёт к файлу, иначе — к папке; если эта эвристика не подходит, после unix_link можно добавить, например, функцию "assign(<is_dir>,false)"); присваивает имя ссылки столбцу <column_name>; если цель известна, присваивает её столбцу <column_link>; присваивает true виртуальному столбцу <is_dir>, если ссылка ведёт к папке; функция выполняется успешно, только если строка имеет ожидаемый формат и не начинается с пробельного символа
unix_device(<column>)тип значений столбца (параметр <column>) должен быть строковым; присваивает столбцу строку, начинающуюся в позиции указателя и содержащую два десятичных числа, разделённых запятой и несколькими пробелами (например, "27, 26"); за строкой должен следовать обычный разделитель (',', '.', ';', ':' и т. п.), пробельный символ или конец строки, но не буква; перемещает указатель за строку; функция выполняется успешно, только если строка найдена
add_string_to_column(<column>, expression) тип значений столбца (параметр <column>) и тип результата выражения (параметр expression) должны быть строковыми; дописывает результат выражения к значению столбца
cut_white_spaces_end(<column>)тип значений столбца (параметр <column>) должен быть строковым; удаляет пробельные символы с конца строки в столбце и присваивает ему новую строку
cut_white_spaces_start(<column>)тип значений столбца (параметр <column>) должен быть строковым; удаляет пробельные символы с начала строки в столбце и присваивает ему новую строку
cut_white_spaces(<column>)тип значений столбца (параметр <column>) должен быть строковым; удаляет пробельные символы с начала и конца строки в столбце и присваивает ему новую строку
back(number)перемещает указатель назад на заданное число символов (параметр number); функция выполняется успешно, только если такое перемещение возможно (переместить указатель на предыдущую строку нельзя)
cut_end_of_string(<column>, number)тип значений столбца (параметр <column>) должен быть строковым; удаляет заданное число символов (параметр number) с конца строки в столбце и присваивает ему новую строку; функция выполняется успешно, только если длина исходного значения столбца была не меньше number

Переменные состояния, используемые при разборе

Доступны следующие переменные состояния:

ПеременнаяОписание
first_nonempty_lineлогическое значение; равно true, только если указатель находится в первой непустой строке (не состоящей исключительно из пробельных символов)
last_nonempty_lineлогическое значение; равно true, только если указатель находится в последней непустой строке (не состоящей исключительно из пробельных символов); полнота списка не учитывается
next_charстрока из одного символа в позиции указателя; если указатель находится в конце списка, строка пустая
next_wordстрока от позиции указателя до первого пробельного символа или символа конца строки, не включая его
rest_of_lineстрока от позиции указателя до символа конца строки, не включая его

Операторы, используемые при разборе

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

Доступны следующие операторы:

ОператорОписание
==равенство; строки сравниваются с учётом регистра
!=неравенство; строки сравниваются с учётом регистра
eqравенство строк; только для строк; сравнение без учёта регистра
not_eqнеравенство строк; только для строк; сравнение без учёта регистра
inпоиск подстроки; равно true, только если подстрока (левый операнд) содержится в строке (правый операнд); сравнение без учёта регистра
not_inравно true, только если подстрока (левый операнд) не содержится в строке (правый операнд); сравнение без учёта регистра
end_withравно true, только если строка (левый операнд) заканчивается подстрокой (правый операнд); сравнение без учёта регистра
not_end_withравно true, только если строка (левый операнд) не заканчивается подстрокой (правый операнд); сравнение без учёта регистра

См. также

Настройка/Серверы
Диалоговое окно Редактирование типа сервера
Диалоговое окно «Редактирование столбца»
Диалоговое окно Тест анализатора

From the Sally manual (GPL-2.0-or-later), © 1997-2023 Open Salamander Authors; © 2025-2026 Elias Bachaalany. Source: manual source (zip) · original page in the Sally repository