public virtual FTPFile[] Parse(string[] fileStrings) { this.log.Debug("Parse() called using culture: " + this.parserCulture.EnglishName); FTPFile[] sourceArray = new FTPFile[fileStrings.Length]; if (fileStrings.Length == 0) { return(sourceArray); } if (!this.userSetParser && !this.parserDetected) { this.DetectParser(fileStrings); } int length = 0; for (int i = 0; i < fileStrings.Length; i++) { if ((fileStrings[i] != null) && (fileStrings[i].Trim().Length != 0)) { try { FTPFile file = null; if (this.parser.IsMultiLine()) { StringBuilder builder = new StringBuilder(fileStrings[i]); while (((i + 1) < fileStrings.Length) && (fileStrings[i + 1].IndexOf(';') < 0)) { builder.Append(" ").Append(fileStrings[i + 1]); i++; } file = this.parser.Parse(builder.ToString()); } else { file = this.parser.Parse(fileStrings[i]); } if (file != null) { if (this.timeDiff.Ticks != 0L) { file.ApplyTimeDifference(this.timeDiff); } sourceArray[length++] = file; } } catch (RestartParsingException) { this.log.Debug("Restarting parsing from first entry in list"); i = -1; length = 0; } } } FTPFile[] destinationArray = new FTPFile[length]; Array.Copy(sourceArray, 0, destinationArray, 0, length); return(destinationArray); }
public virtual FTPFile PartialParse(string fileString, ArrayList allFileStrings) { if (allFileStrings.Count == 1) { log.Debug("PartialParse() called using culture: " + parserCulture.EnglishName); } bool isLastLine = fileString == null; if (!userSetParser && !parserDetected) { DetectParser((string[])allFileStrings.ToArray(typeof(string))); } if (!userSetParser && !parserDetected) { return(null); } if (fileString == null || fileString.Trim().Length == 0) { return(null); } try { FTPFile file = null; if (parser.IsMultiLine()) { // vms uses more than 1 line for some file listings. We must keep going // thru till we've got everything if (!isLastLine) { if (allFileStrings.Count < 2) { return(null); } string secondLastFileString = (string)allFileStrings[allFileStrings.Count - 2]; string lastFileString = (string)allFileStrings[allFileStrings.Count - 1]; if (lastFileString.IndexOf(';') < 0) { secondLastFileString += lastFileString; } file = parser.Parse(secondLastFileString); } else { if (allFileStrings.Count == 0) { return(null); } else { file = parser.Parse(allFileStrings[allFileStrings.Count - 1].ToString()); } } } else { file = parser.Parse(fileString); } // we skip null returns - these are duff lines we know about and don't // really want to throw an exception if (file != null) { if (timeDiff.Ticks != 0) { file.ApplyTimeDifference(timeDiff); } return(file); } else { return(null); } } catch (RestartParsingException) { throw; } }
/// <summary> /// Parse an array of raw file information returned from the /// FTP server /// </summary> /// <param name="fileStrings"> array of strings /// </param> /// <returns> array of FTPFile objects /// </returns> public virtual FTPFile[] Parse(string[] fileStrings) { log.Debug("Parse() called using culture: " + parserCulture.EnglishName); FTPFile[] files = new FTPFile[fileStrings.Length]; // quick check if no files returned if (fileStrings.Length == 0) { return(files); } if (!userSetParser && !parserDetected) { DetectParser(fileStrings); } int count = 0; for (int i = 0; i < fileStrings.Length; i++) { if (fileStrings[i] == null || fileStrings[i].Trim().Length == 0) { continue; } try { FTPFile file = null; if (parser.IsMultiLine()) { // vms uses more than 1 line for some file listings. We must keep going // thru till we've got everything StringBuilder filename = new StringBuilder(fileStrings[i]); while (i + 1 < fileStrings.Length && fileStrings[i + 1].IndexOf(';') < 0) { filename.Append(" ").Append(fileStrings[i + 1]); i++; } file = parser.Parse(filename.ToString()); } else { file = parser.Parse(fileStrings[i]); } // we skip null returns - these are duff lines we know about and don't // really want to throw an exception if (file != null) { if (timeDiff.Ticks != 0) { file.ApplyTimeDifference(timeDiff); } files[count++] = file; } } catch (RestartParsingException) { log.Debug("Restarting parsing from first entry in list"); i = -1; count = 0; continue; } } FTPFile[] result = new FTPFile[count]; Array.Copy(files, 0, result, 0, count); return(result); }