2010-03-14 19 views
5

Estoy escribiendo un servidor ftp incrustado, y no puedo obtener el formato de listado correctamente. El servidor funciona completamente, solo los programas como FileZilla no pueden interpretar el formato de listado. He aquí una lista de ejemplos:FTP Formato de lista

-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 

que es básicamente:

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

¿Qué estoy haciendo mal?

Gracias, Yvan

+0

no existe un formato estándar para la salida de lista de FTP. Diferentes servidores usan diferentes formatos. ¿A cuál estás tratando de emular? – skaffman

+0

UNIX uno: es un servidor incorporado para el iPhone escrito en C#. Pero he encontrado el problema: mis listados de directorios no estaban alineados correctamente, y mis listados de archivos sí. Ahora se abre en FileZilla correctamente. ¡Gracias! – friedkiwi

Respuesta

7

Como otros ya han mencionado, necesita usar espacios en lugar de pestañas. He aquí una sprintf desde otro servidor FTP integrado que debería funcionar:

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

permstr se establece en una cadena como "-rw-rw-rw-".

En cuanto a los formatos de fecha, estos dos deben trabajar, con la parte superior utilizarse si la fecha es más de 6 meses de edad:

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

el servidor FTP típico sería bombardear a ls -l para el listado de directorios. Creo que esta salida contiene caracteres espaciales que alinean la salida, no los caracteres de pestañas.

La única manera en que puede estar seguro de por qué FileZilla no está analizando su directorio es obtener el código abierto para FileZilla y ver lo que está sucediendo en el depurador. Pero creo que puede avanzar simplemente duplicando la salida de ls de la manera más exacta posible, incluido el espacio en blanco.

7

Dado que no se ha especificado el lenguaje de programación, pensé que iba a dar a mis 2cents a esto ....

 
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 

He decidido incluir los C# de expresiones regulares de abajo para mostrar, esto puede ser adaptado a satisfacer sus necesidades,

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

darse cuenta del hecho, no hay ninguna ficha, es puramente espacios ... y tenga cuidado, algunos clientes FTP pueden leer la lista, ya sea como MS-DOS o Unix ...

+0

¿Qué significa el "número de inodos"? – Nyerguds

+1

Todo el enfoque de FTP LIST todavía es de uso limitado porque en UNIX falta la parte de tiempo del archivo y en Windows faltan los segundos. Es mejor recuperar solo los nombres de los archivos con NLST y luego, para cada archivo, recuperar el tiempo y el tamaño del archivo usando MDTM y SIZE. libcurl tiene soporte para esto. – rustyx