public IEnumerable<FtpFile> ListFiles(FtpFile parent = null)
		{
		    var parentPath = parent == null ? "" : parent.Path;
			var ftp = GetRequest(GetDirectory(parent.Path));
			// Set request to do simple list
			ftp.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails;

			string str = GetStringResponse(ftp);
			// replace CRLF to CR, remove last instance
			str = str.Replace("\r\n", "\r").TrimEnd('\r');

		    foreach (var line in str.Replace("\n", "").Split(System.Convert.ToChar('\r')))
		    {
		        //parse
		        if (line != "")
		        {
		            var m = GetMatchingRegex(line);
		            if (m == null)
		            {
		                //failed
		                throw (new ApplicationException("Unable to parse line: " + line));
		            }
		            else
		            {
		                var filename = m.Groups["name"].Value;
		                var path = parentPath + filename;
		                var dir = m.Groups["dir"].Value;
		                FtpFile file;
		                if (dir != "" && dir != "-")
		                {
		                    file = new FtpDir(parentPath, filename);
		                }
		                else
		                {
		                    file = new FtpFile(parentPath, filename);
		                }
		                yield return file;
		            }
		        }
		    }
		}
        public FtpDir(FtpFile dir, string name)
            : base(dir, name)
        {

        }
        public FtpFile(FtpFile dir, string name)
            : this(dir == null ? null : dir.Path, name)
        {

        }