FTP列表格式

时间:2010-03-14 17:19:33

标签: ftp

我正在编写一个嵌入式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 个答案:

答案 0 :(得分:7)

由于你没有指定编程语言,我认为我会给出我的2cents ....

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 ......

答案 1 :(得分:7)

正如其他人已经提到的那样,您需要使用空格而不是制表符。这是来自另一个应该工作的嵌入式FTP服务器的sprintf:

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);

答案 2 :(得分:1)

典型的ftp服务器会向ls -l发送目录列表。我相信这个输出包含对齐输出的空格字符,而不是制表符。

您可以确定FileZilla未解析目录列表的唯一方法是获取FileZilla的开源并观察调试器中发生的情况。但我认为你可以通过尽可能准确地复制ls的输出来取得进展,包括空格。