Формат списка FTP - PullRequest
       17

Формат списка FTP

5 голосов
/ 14 марта 2010

Я пишу встроенный FTP-сервер и не могу правильно получить формат листинга.Сервер работает полностью, только программы, подобные FileZilla, не могут интерпретировать формат листинга.Вот пример листинга:

-rwxr--r--  1   owner   group 640   1970 01 01  test
-rwxr--r--  1   owner   group 13440 1970 01 01  test.html
-rwxr--r--  1   owner   group 512   1970 01 01  test2.txt

Что в основном:

permissions[tab]number?[tab]owner[tab]group[tab]filesize[tab]date[tab]filename 

Что я делаю не так?

Спасибо, Иван

Ответы [ 3 ]

7 голосов
/ 14 марта 2010

Поскольку вы не указали язык программирования, я решил отдать свои 2цента этому ...

permissions[tab]number?[tab]owner[tab]group[tab]filesize[tab]date[tab]filename 
                ^^^^^^^                                      ^^^^
             no of inodes                      Dates can vary, it can be year on its own or Month, Day

Я решил включить приведенное ниже C # регулярное выражение, чтобы показать, что оно может быть адаптировано к вашим потребностям,

            private Regex ftpUnixListInfo = new Regex(
                @"(?" +
                @"(?[-|d|r|w|x]+)\s+" +
                @"(?\d+)\s*" +
                @"(?\w+)?\s+" +
                @"(?\w+)\s*" +
                @"(?\d+)\s+" +
                @"(?\w+)\s+" +
                @"(?\d{1,2})\s+" +
                @"(?:(?\d{2}\:\d{2})|(?\d{4}))\s+" +
                @"(?.+))",
                RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.IgnorePatternWhitespace
                | RegexOptions.Compiled);

            // Regex for Microsoft FTP Server
            private Regex ftpMsListInfo = new Regex(
                @"(?" +
                @"(?\d+-\d+-\d+)\s+" +
                @"(?\d+\:\d+(AM|PM))\s*" +
                @"(?((?\)|(?\d+))\s*)" +
                @"(?\w+))",
                RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.IgnorePatternWhitespace
                | RegexOptions.Compiled);

Обратите внимание на тот факт, что вкладки нет, это просто пробелы ... и будьте осторожны, некоторые FTP-клиенты могут читать листинг как MSDOS или Unix ...

7 голосов
/ 14 марта 2010

Как уже упоминали другие, вам нужно использовать пробелы вместо вкладок. Вот sprintf с другого встроенного FTP-сервера, который должен работать:

sprintf(line, "%s   1 %-10s %-10s %10lu Jan  1  1980 %s\r\n",
    permstr, username, username,
    length,
    filename);

permstr имеет значение типа "-rw-rw-rw-".

Что касается форматов даты, эти два должны работать, причем верхний используется, если дата старше 6 месяцев:

if (dfmt)
    sprintf(buf, "%3.3s %2d  %04d", month_name, month_num, year);
else
    sprintf(buf, "%3.3s %2d %02d:%02d", month_name, month_num, hour, minute);
1 голос
/ 14 марта 2010

Типичный FTP-сервер выдает ls -l для списка каталогов. Я считаю, что этот вывод содержит пробелы, которые выравнивают вывод, а не символы табуляции.

Единственный способ убедиться, почему FileZilla не анализирует список каталогов, - это получить открытый исходный код FileZilla и посмотреть, что происходит в отладчике. Но я думаю, что вы можете добиться прогресса, просто продублировав вывод ls настолько точно, насколько это возможно, включая пробелы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...