>drw-rw-rw- 1 user group 0 Apr 15 14:36 . >drw-rw-rw- 1 user group 0 Apr 15 14:36 .. >-rw-rw-rw- 1 user group 66710 Apr 7 01:14 00000014.jpg >-rw-rw-rw- 1 user group 65566 Apr 7 01:14 00000015.jpg >-rw-rw-rw- 1 user group 59998 Apr 7 01:14 00000016.jpg >-rw-rw-rw- 1 user group 59591 Apr 7 01:14 00000017.jpg >-rw-rw-rw- 1 user group 76124 Apr 7 01:14 00000018.jpg >-rw-rw-rw- 1 user group 56467 Apr 7 01:14 00000019.jpg >-rw-rw-rw- 1 user group 71404 Apr 7 01:15 00000020.jpg >-rw-rw-rw- 1 user group 61161 Apr 7 01:15 00000021.jpg >-rw-rw-rw- 1 user group 66224 Apr 7 01:15 00000022.jpg >-rw-rw-rw- 1 user group 66710 Apr 15 14:37 00000024.jpg >
True 15/04/2010 14:36:00 0 . True 15/04/2010 14:36:00 0 .. False 07/04/2010 01:14:00 66710 00000014.jpg False 07/04/2010 01:14:00 65566 00000015.jpg False 07/04/2010 01:14:00 59998 00000016.jpg False 07/04/2010 01:14:00 59591 00000017.jpg False 07/04/2010 01:14:00 76124 00000018.jpg False 07/04/2010 01:14:00 56467 00000019.jpg False 07/04/2010 01:15:00 71404 00000020.jpg False 07/04/2010 01:15:00 61161 00000021.jpg False 07/04/2010 01:15:00 66224 00000022.jpg False 15/04/2010 14:37:00 66710 00000024.jpg
#define FORMAT2 using System; using System.Collections.Generic; using System.Linq; using System.Text; //using GregoryAdam.Base.Debugging; //using GregoryAdam.Base.Text.RegEx; using System.Net; using System.IO; using System.Text.RegularExpressions; using System.Diagnostics; namespace BaseTest { //______________________________________________________________________ class Program { static string Site = @"ftp://ftp.prolib.de/Public"; static string UserId = "anonymous"; static string Passwd = "password"; public static void Main() { var ftp = new FtpTest(Site, UserId, Passwd); #if !FORMAT2 var files = ftp.GetDirectoryListing(""); #else var files = ftp.GetFormat2(); #endif foreach (var f in files) { Console.WriteLine( "{0} {1} {2} {3}", f.IsDirectory, f.FileTime, f.FileSize, f.FileName); } Console.ReadLine(); } } //______________________________________________________________________ public class FtpTest { string Site; NetworkCredential Credentials ; static string LinePattern = @"^(?<IsFolder>\S)(?<Permissions>\S{9})\s+(?<Links>\d+)\s+(?<User>\S+)\s+(?<Group>\S+)\s+(?<FileSize>\d+)\s+((?<DateTimeCurrentYear>(?<Month>\S{3})\s+(?<Day>\d{1,2})\s+(?<Time>\d\d:\d\d))|(?<DateTimeYear>(?<Month>\S{3})\s+(?<Day>\d{1,2})\s+(?<Year>\d{4})))\s+(?<FileName>\S+)$"; //______________________________________________________________________ public FtpTest(string site, string userId, string passwd) { Site = site; Credentials = new NetworkCredential(userId, passwd); } //______________________________________________________________________ public List<FtpFileInfo> GetDirectoryListing(string path ) { var request = (FtpWebRequest)WebRequest.Create(Site + "/" + path ); request.Credentials = Credentials; request.Method = WebRequestMethods.Ftp.ListDirectoryDetails; var response = (FtpWebResponse)request.GetResponse(); List<FtpFileInfo> list; using (var stream = new StreamReader(response.GetResponseStream())) { list = Parse(stream); } return list; } //______________________________________________________________________ private List<FtpFileInfo> Parse(StreamReader stream) { var list = new List<FtpFileInfo>(); while (!stream.EndOfStream) { string line = stream.ReadLine(); Match match = Regex.Match(line, LinePattern); if (match.Success) { bool isFolder = match.Groups["IsFolder"].Value == "d"; string fileName = match.Groups["FileName"].Value; ulong fileSize = Convert.ToUInt64(match.Groups["FileSize"].Value); DateTime dateTime; if (String.IsNullOrEmpty(match.Groups["DateTimeCurrentYear"].Value)) { // Month, Day, Year dateTime = Convert.ToDateTime(match.Groups["DateTimeYear"].Value); } else { // Month, Day, Time dateTime = Convert.ToDateTime( String.Format( "{0} {1} {2:D4} {3}", match.Groups["Month"].Value, match.Groups["Day"].Value, DateTime.Now.Year, match.Groups["Time"].Value ) ); if (dateTime > DateTime.Now) dateTime = dateTime.AddYears(-1); } list.Add(new FtpFileInfo(isFolder, fileName, dateTime, fileSize)); } else { Debug.Assert(false, "cannot parse", line); } } return list; } //______________________________________________________________________ public List<FtpFileInfo> GetFormat2() { string format2 = @"drw-rw-rw- 1 user group 0 Apr 15 14:36 . drw-rw-rw- 1 user group 0 Apr 15 14:36 .. -rw-rw-rw- 1 user group 66710 Apr 7 01:14 00000014.jpg -rw-rw-rw- 1 user group 65566 Apr 7 01:14 00000015.jpg -rw-rw-rw- 1 user group 59998 Apr 7 01:14 00000016.jpg -rw-rw-rw- 1 user group 59591 Apr 7 01:14 00000017.jpg -rw-rw-rw- 1 user group 76124 Apr 7 01:14 00000018.jpg -rw-rw-rw- 1 user group 56467 Apr 7 01:14 00000019.jpg -rw-rw-rw- 1 user group 71404 Apr 7 01:15 00000020.jpg -rw-rw-rw- 1 user group 61161 Apr 7 01:15 00000021.jpg -rw-rw-rw- 1 user group 66224 Apr 7 01:15 00000022.jpg -rw-rw-rw- 1 user group 66710 Apr 15 14:37 00000024.jpg"; var memStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(format2)); List<FtpFileInfo> list; using (var str = new StreamReader(memStream)) { list = Parse(str); } return list; } //______________________________________________________________________ } public class FtpFileInfo { public readonly bool IsDirectory; public readonly string FileName; public readonly DateTime FileTime; public readonly ulong FileSize; //______________________________________________________________________ public FtpFileInfo(bool isDirectory, string fileName, DateTime fileTime, ulong fileSize) { IsDirectory = isDirectory; FileName = fileName; FileTime = fileTime; FileSize = fileSize; } //______________________________________________________________________ } }