2009-06-08 5 views
4

La commande FTP LIST affiche une liste de tous les fichiers et répertoires du répertoire de travail en cours. Le problème est, il renvoie plusieurs formats différents en fonction du serveur. Quelqu'un sait-il d'une bibliothèque .NET qui est capable d'analyser les formats les plus populaires? Je suis d'accord avec une approche "essayez cette regex, si elle échoue, essayez la prochaine regex".Réponse à l'analyse de la commande FTP LIST (variations de syntaxe)

Répondre

4

Voici un RegEx que j'ai utilisé pour un projet. Semble fonctionner pour les serveurs FTP Windows et Unix. Quelqu'un pourrait être en mesure de le nettoyer, mais je le construis en concaténant un tas de propriétés sur une classe. Donc ce n'est pas aussi brutal à maintenir pour moi.

^((?<DIR>([dD]{1}))|)(?<ATTRIBS>(.*))\s(?<SIZE>([0-9]{1,}))\s(?<DATE>((?<MONTHDAY>((?<MONTH>(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\s(?<DAY>([0-9\s]{2}))))\s(\s(?<YEAR>([0-9]{4}))|(?<TIME>([0-9]{2}\:[0-9]{2})))))\s(?<NAME>([A-Za-z0-9\-\._\s]{1,}))$ 
8

est ici celui que je l'ai utilisé pour un serveur FileZilla:

^(?<dir>[\-ld])(?<permission>([\-r][\-w][\-xs]){3})\s+(?<filecode>\d+)\s+(?<owner>\w+)\s+(?<group>\w+)\s+(?<size>\d+)\s+(?<timestamp>((?<month>\w{3})\s+(?<day>\d{2})\s+(?<hour>\d{1,2}):(?<minute>\d{2}))|((?<month>\w{3})\s+(?<day>\d{1,2})\s+(?<year>\d{4})))\s+(?<name>.+)$ 

http://chrishaas.wordpress.com/2009/06/10/regex-for-parsing-ftp-list-command/

+0

Merci beaucoup! –

+1

Notez que sur le serveur que j'utilise, le jour peut être 1 ou 2 chiffres, donc j'ai dû changer '(? \ d {2})' '(? \ d {1,2})' –

+0

Cela semble être une excellente réponse pour moi. L'Op devrait marquer ceci comme la réponse si c'était ce qu'il a utilisé pour surmonter son problème, ou fournir sa propre réponse. –

1
^(?<dir>[\-ld])(?<permission>([\-r][\-w][\-xs]){3})\s+(?<filecode>\d+)\s+(?<owner>\w+)\s+(?<group>\w+)\s+(?<size>\d+)\s+(?<timestamp>((?<month>\w{3})\s+(?<day>\d{1,2})\s+(?<hour>\d{1,2}):(?<minute>\d{2}))|((?<month>\w{3})\s+(?<day>\d{1,2})\s+(?<year>\d{4})))\s+(?<name>.+)$ 

version modifiée Chris Haas un tout petit peu de bits. Changé de sorte que le groupe de jours puisse également être constitué d'un seul nombre. \ d {2} -> \ d {1,2}

Merci pour la version originale.

+0

Merci pour la mise à jour! J'ai mis à jour la réponse de Chris pour inclure ce changement. –

0
^(?<dir>[\-ld])(?<permission>([\-r][\-w][\-xs]){3})\s+(?<filecode>\d+)\s+(?<owner>\S+)\s+(?<group>\S+)\s+(?<size>\d+)\s+(?<timestamp>((?<month>\w{3})\s+(?<day>\d{1,2})\s+(?<hour>\d{1,2}):(?<minute>\d{2}))|((?<month>\w{3})\s+(?<day>\d{1,2})\s+(?<year>\d{4})))\s+(?<name>.+)$ 

Sur le site, le propriétaire est affiché au format Adresse de messagerie. J'ai changé le propriétaire et le groupe pour qu'ils soient des caractères non-espace au lieu des caractères de mot.

Ceci est en expansion sur la version Yodiz de la version de Chris Haas. Merci beaucoup!