C# classe pour analyser WebRequestMethods.Ftp.ListDirectoryDetails réponse FTP
Je suis de la création d'un service pour surveiller les sites FTP pour de nouvelles mises à jour et exigent la capacité à analyser la réponse retournée à partir d'un FtpWebRequest réponse à l'aide de la WebRequestMethods.Ftp.ListDirectoryDetails méthode. Il serait assez facile si toutes les réponses a suivi le même format, mais différentes serveur FTP logiciel fournir différents formats de réponse.
Par exemple, on pourrait retourner:
08-10-11 12:02PM <DIR> Version2
06-25-09 02:41PM 144700153 image34.gif
06-25-09 02:51PM 144700153 updates.txt
11-04-10 02:45PM 144700214 digger.tif
Et un autre serveur peut retourner:
d--x--x--x 2 ftp ftp 4096 Mar 07 2002 bin
-rw-r--r-- 1 ftp ftp 659450 Jun 15 05:07 TEST.TXT
-rw-r--r-- 1 ftp ftp 101786380 Sep 08 2008 TEST03-05.TXT
drwxrwxr-x 2 ftp ftp 4096 May 06 12:24 dropoff
Et d'autres différences ont été observées aussi donc il y a probablement un certain nombre de différences subtiles je n'ai pas rencontré encore.
Personne ne sait d'complètement gérée (ne nécessite pas d'accès à des dll sous Windows) de classe C# qui gère ces situations de façon transparente?
Je n'ai besoin de lister le contenu d'un répertoire avec les détails suivants: nom de Fichier/dossier, dernière mise à jour ou créé d'horodatage, nom de fichier/dossier.
Merci d'avance pour toutes les suggestions,
Gavin
- Juste une remarque - FTP n'est pas spécifier le format exact de la liste, et il existe plus de 400 formats (bien que les deux que vous avez mentionnés, Windows et Unix) sont les plus utilisés de tous.
- Ouf - c'est beaucoup de formats!
- J'ai trouvé cet exemple, mais je doute que c'est trop robuste - blogs.msdn.com/b/adarshk/archive/2004/09/15/230177.aspx
- Juste une info, je viens de premier type et je l'utilise
dateTime = DateTime.ParseExact(datestring, "MM-dd-yy HH:mmtt", DateTimeFormatInfo.InvariantInfo);
à analyser. Notez que l'espace entreyy HH
devrait être le double de l'espace.
Vous devez vous connecter pour publier un commentaire.
Pour la première (DOS/Windows) l'inscription de ce code:
Vous obtiendrez:
Pour les autres (*nix) la cotation, voir ma réponse à l'Analyse FtpWebRequest ListDirectoryDetails ligne.
Mais, en fait en essayant d'analyser la liste retournée par la
ListDirectoryDetails
n'est pas la bonne façon de faire.Vous souhaitez utiliser un client FTP qui supporte le moderne
MLSD
de commande qui retourne une liste de répertoires dans un format lisible en machine spécifiée dans le RFC 3659. L'analyse du format lisible par l'homme retourné par les anciensLIST
de commande (utilisé en interne par leFtpWebRequest
pour sonListDirectoryDetails
méthode) doit être utilisé comme une option de dernier recours, lorsque l'on parle à obsolètes serveurs FTP, qui ne prennent pas en charge laMLSD
de commande (comme Microsoft IIS serveur FTP).Par exemple avec WinSCP .NET de l'assemblée, vous pouvez utiliser ses
Session.ListDirectory
ouSession.EnumerateRemoteFiles
méthodes.Ils utiliser à l'interne de la
MLSD
de commande, mais peuvent revenir à laLIST
de commandement et de soutien des douzaines de différents lisible liste des formats.Le retour de l'inscription est présentée comme la collecte de
RemoteFileInfo
des instances avec des propriétés comme:Name
LastWriteTime
(avec le bon fuseau horaire)Length
FilePermissions
(analysée dans les droits individuels)Group
Owner
IsDirectory
IsParentDirectory
IsThisDirectory
(Je suis l'auteur de WinSCP)
La plupart des autres 3ème partie les bibliothèques vont faire de même. À l'aide de la
FtpWebRequest
de la classe n'est pas fiable à cet effet. Malheureusement, il n'y a pas d'autre client FTP intégré dans la .NET framework.Je suis confronté à ce même problème et ont construit un simple (mais pas très solide) de la solution à l'aide d'une Regex pour analyser les informations pertinentes de chaque ligne à l'aide de groupes de capture:
Vous pouvez ensuite extraire les valeurs des groupes de capture par:
Certaines choses à ne pas noter sont les suivants:
ftpResponse
variable ci-dessus. Dans mon cas, j'ai de la chance d'être seulement d'accéder au même serveur FTP à chaque fois et il est donc peu probable que le format de la réponse va changer.yearTime
variable peut représenter SOIT l'année ou le moment de l'horodatage de l'. Vous aurez besoin d'analyser manuellement par la recherche d'une instance du côlon : le caractère qui indique que ce groupe de capture contient un temps plutôt que de l'annéeUne solution, je suis tombé sur EdtFTPnet
EdtFTPnet semble être une caractéristique emballés solution qui gère beaucoup de différentes options FTP est idéal.
C'est de l'open source de la solution que j'ai comment employées pour http://www.ftp2rss.com (un petit outil que j'ai besoin moi-même, mais pensé que peut-être utile à d'autres aussi).
Prendre un coup d'oeil à http://Ftp.dll client FTP.
Il comprend automatique de la liste de l'annuaire de l'analyseur pour la plupart des serveurs FTP sur Windows, Netware et Unix, les plates-formes.
Veuillez noter que ceci est un produit commercial, j'ai développé.