Я пишу встроенный 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
Что я делаю неправильно?
Спасибо, Yvan
Как уже упоминалось, вам нужно использовать пробелы вместо табуляции. Вот 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);
Типичный ftp-сервер будет обращаться к ls -l
для вывода списка каталогов. Я считаю, что этот вывод содержит символы пробела, которые выравнивают вывод, а не символы табуляции.
Единственный способ узнать, почему FileZilla не анализирует список каталогов, - это получить открытый исходный код для FileZilla и посмотреть, что происходит в отладчике. Но я думаю, что вы можете добиться прогресса, просто продублировав вывод ls
как можно точнее, включая пробелы.
Так как вы не указали язык программирования, я решил дать свои 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# regexp'ы ниже, чтобы показать, что это может быть адаптировано под ваши нужды,
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...