示例#1
0
        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);
        }