public static IList <DirectoryListItem> GetDirectoryList(string datastring) { try { var myListArray = new List <DirectoryListItem>(); var dataRecords = datastring.Split('\n'); var directoryListStyle = GuessDirectoryListingStyle(dataRecords); foreach (var s in dataRecords) { if (directoryListStyle != EDirectoryListingStyle.Unknown && s != "") { var f = new DirectoryListItem(); f.Name = ".."; switch (directoryListStyle) { case EDirectoryListingStyle.UnixStyle: f = ParseDirectoryListItemFromUnixStyleRecord(s); break; case EDirectoryListingStyle.WindowsStyle: f = ParseDirectoryListItemFromWindowsStyleRecord(s); break; } if (!(f == null || f.Name == "." || f.Name == "..")) { myListArray.Add(f); } } } return(myListArray); } catch (Exception ex) { throw new FtpException("Unable to parse the directory list", ex); } }
private static DirectoryListItem ParseDirectoryListItemFromWindowsStyleRecord(string record) { //Assuming the record style as // 02-03-04 07:46PM <DIR> Append var f = new DirectoryListItem(); var processstr = record.Trim(); var dateStr = processstr.Substring(0, 8); processstr = processstr.Substring(8, processstr.Length - 8).Trim(); var timeStr = processstr.Substring(0, 7); processstr = processstr.Substring(7, processstr.Length - 7).Trim(); f.CreationTime = DateTime.Parse(dateStr + " " + timeStr, CultureInfo.GetCultureInfo("en-US")); if (processstr.Substring(0, 5) == "<DIR>") { f.IsDirectory = true; processstr = processstr.Substring(5, processstr.Length - 5).Trim(); } else { f.IsDirectory = false; var i = processstr.IndexOf(' '); f.Size = ulong.Parse(processstr.Substring(0, i)); processstr = processstr.Substring(i + 1); } f.Name = processstr; //Rest is name return(f); }
private static DirectoryListItem ParseDirectoryListItemFromUnixStyleRecord(string record) { //Assuming record style as // dr-xr-xr-x 1 owner group 0 Nov 25 2002 bussys // Mac OS X - tnftpd returns the total on the first line if (record.ToLower().StartsWith("total ")) { return(null); } var f = new DirectoryListItem(); var processstr = record.Trim(); processstr = processstr.Substring(processstr.IndexOf(' ') - 10); f.Flags = processstr.Substring(0, 10); f.IsDirectory = f.Flags[0] == 'd'; // Note: there is no way to determine here if the symlink refers to a dir or a file f.IsSymLink = f.Flags[0] == 'l'; processstr = processstr.Substring(11).Trim(); CutSubstringFromStringWithTrim(ref processstr, " ", 0); //skip one part f.Owner = CutSubstringFromStringWithTrim(ref processstr, " ", 0); f.Group = CutSubstringFromStringWithTrim(ref processstr, " ", 0); f.Size = ulong.Parse(CutSubstringFromStringWithTrim(ref processstr, " ", 0)); var creationTimeStr = CutSubstringFromStringWithTrim(ref processstr, " ", 8); string dateFormat; if (creationTimeStr.IndexOf(':') < 0) { dateFormat = "MMM dd yyyy"; } else { dateFormat = "MMM dd H:mm"; } // Some servers (e.g.: Mac OS X 10.5 - tnftpd) return days < 10 without a leading 0 if (creationTimeStr[4] == ' ') { creationTimeStr = creationTimeStr.Substring(0, 4) + "0" + creationTimeStr.Substring(5); } f.CreationTime = DateTime.ParseExact(creationTimeStr, dateFormat, CultureInfo.GetCultureInfo("en-US"), DateTimeStyles.AllowWhiteSpaces); if (f.IsSymLink && processstr.IndexOf(UnixSymLinkPathSeparator) > 0) { f.Name = CutSubstringFromStringWithTrim(ref processstr, UnixSymLinkPathSeparator, 0); f.SymLinkTargetPath = processstr; } else { f.Name = processstr; //Rest of the part is name } return(f); }