用c#写的ftp 搜索引擎,该程序是采用WFS算法,

程序如下:

主程序:

using  System;
using  System.Net;
using  System.IO;
using  System.Text;
using  System.Net.Sockets;
using  System.Collections;

namespace  ftp
... {
   public  class FTP
    ...{
        static ArrayList ar = new ArrayList();
//对于每一个remotehost,该方法广度优先便利ftp站点的所有文件及文件夹
        public static void GetFileListByHost(string HostName, string UserName, string Password)
        ...{
            FTPclient ftp = new FTPclient(HostName, UserName, Password);
            FTPdirectory fd = ftp.ListDirectoryDetail("/");
            for (int i = 0; i < fd.Count; i++)
            ...{
                Console.WriteLine(fd[i].Filename + "      " + fd[i].Size);
                if (fd[i].FileType == FTPfileInfo.DirectoryEntryTypes.Directory)
                ...{
                    if (fd[i].NameOnly != "" && fd[i].NameOnly != "." && fd[i].NameOnly != "..")
                        ar.Add(fd[i]);
                }
            }
            while (ar.Count > 0)
            ...{
                try
                ...{
                    fd = ftp.ListDirectoryDetail(((FTPfileInfo)ar[0]).FullName + "/");
                    for (int i = 0; i < fd.Count; i++)
                    ...{
                        Console.WriteLine(fd[i].Filename + "      " + fd[i].Size);//将该句代码换成写进数据库的代码就OK
                        if (fd[i].FileType == FTPfileInfo.DirectoryEntryTypes.Directory)
                        ...{
                            if (fd[i].NameOnly != "" && fd[i].NameOnly != "." && fd[i].NameOnly != "..")
                                ar.Add(fd[i]);
                        }
                    }
                }
                catch
                ...{
                    continue;
                }
                finally
                ...{
                    ar.RemoveAt(0);
                }
            }

        }
    }
}

FtpClint类

using  System.Diagnostics;
using  System.Data;
using  System.Collections;
using  Microsoft.VisualBasic;
using  System.Collections.Generic;
using  System;
using  System.Net;
using  System.IO;
using  System.Text.RegularExpressions;

namespace  ftp
... {

    
    "FTP client class"#region "FTP client class"
    /**//// <summary>
    /// A wrapper class for .NET 2.0 FTP
    /// </summary>
    /// <remarks>
    /// This class does not hold open an FTP connection but
    /// instead is stateless: for each FTP request it
    /// connects, performs the request and disconnects.
    /// </remarks>
    public class FTPclient
    ...{


        "CONSTRUCTORS"#region "CONSTRUCTORS"
        /**//// <summary>
        /// Blank constructor
        /// </summary>
        /// <remarks>Hostname, username and password must be set manually</remarks>
        public FTPclient()
        ...{
        }

        /**//// <summary>
        /// Constructor just taking the hostname
        /// </summary>
        /// <param name="Hostname">in either ftp://ftp.host.com or ftp.host.com form</param>
        /// <remarks></remarks>
        public FTPclient(string Hostname)
        ...{
            _hostname = Hostname;
        }

        /**//// <summary>
        /// Constructor taking hostname, username and password
        /// </summary>
        /// <param name="Hostname">in either ftp://ftp.host.com or ftp.host.com form</param>
        /// <param name="Username">Leave blank to use 'anonymous' but set password to your email</param>
        /// <param name="Password"></param>
        /// <remarks></remarks>
        public FTPclient(string Hostname, string Username, string Password)
        ...{
            _hostname = Hostname;
            _username = Username;
            _password = Password;
        }
        #endregion

        "Directory functions"#region "Directory functions"
        /**//// <summary>
        /// Return a simple directory listing
        /// </summary>
        /// <param name="directory">Directory to list, e.g. /pub</param>
        /// <returns>A list of filenames and directories as a List(of String)</returns>
        /// <remarks>For a detailed directory listing, use ListDirectoryDetail</remarks>
        public List<string> ListDirectory(string directory)
        ...{
            //return a simple list of filenames in directory
            System.Net.FtpWebRequest ftp = GetRequest(GetDirectory(directory));
            //Set request to do simple list
            ftp.Method = System.Net.WebRequestMethods.Ftp.ListDirectory;
            string str = GetStringResponse(ftp);
            //replace CRLF to CR, remove last instance
            str = str.Replace(" ", " ").TrimEnd(' ');
            //split the string into a list
            List<string> result = new List<string>();
            result.AddRange(str.Split(' '));
            return result;
        }

        /**//// <summary>
        /// Return a detailed directory listing
        /// </summary>
        /// <param name="directory">Directory to list, e.g. /pub/etc</param>
        /// <returns>An FTPDirectory object</returns>
        public FTPdirectory ListDirectoryDetail(string directory)
        ...{
            System.Net.FtpWebRequest ftp = GetRequest(GetDirectory(directory));
            //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(" ", " ").TrimEnd(' ');
            //split the string into a list
            return new FTPdirectory(str, _lastDirectory);
        }

        #endregion               

        "private supporting fns"#region "private supporting fns"
        //Get the basic FtpWebRequest object with the
        //common settings and security
        private FtpWebRequest GetRequest(string URI)
        ...{
            //create request
            FtpWebRequest result = (FtpWebRequest)FtpWebRequest.Create(URI);
            //Set the login details
            result.Credentials = GetCredentials();
            //Do not keep alive (stateless mode)
            result.KeepAlive = false;
            return result;
        }


        /**//// <summary>
        /// Get the credentials from username/password
        /// </summary>
        private System.Net.ICredentials GetCredentials()
        ...{
            return new System.Net.NetworkCredential(Username, Password);
        }

        /**//// <summary>
        /// returns a full path using CurrentDirectory for a relative file reference
        /// </summary>
        private string GetFullPath(string file)
        ...{
            if (file.Contains("/"))
            ...{
                return AdjustDir(file);
            }
            else
            ...{
                return this.CurrentDirectory + file;
            }
        }

        /**//// <summary>
        /// Amend an FTP path so that it always starts with /
        /// </summary>
        /// <param name="path">Path to adjust</param>
        /// <returns></returns>
        /// <remarks></remarks>
        private string AdjustDir(string path)
        ...{
            return ((path.StartsWith("/")) ? "" : "/").ToString() + path;
        }

        private string GetDirectory(string directory)
        ...{
            string URI;
            if (directory == "")
            ...{
                //build from current
                URI = Hostname + this.CurrentDirectory;
                _lastDirectory = this.CurrentDirectory;
            }
            else
            ...{
                if (!directory.StartsWith("/"))
                ...{
                    throw (new ApplicationException("Directory should start with /"));
                }
                URI = this.Hostname + directory;
                _lastDirectory = directory;
            }
            return URI;
        }

        //stores last retrieved/set directory
        private string _lastDirectory = "";

        /**//// <summary>
        /// Obtains a response stream as a string
        /// </summary>
        /// <param name="ftp">current FTP request</param>
        /// <returns>String containing response</returns>
        /// <remarks>FTP servers typically return strings with CR and
        /// not CRLF. Use respons.Replace(vbCR, vbCRLF) to convert
        /// to an MSDOS string</remarks>
        private string GetStringResponse(FtpWebRequest ftp)
        ...{
            //Get the result, streaming to a string
            string result = "";
            using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse())
            ...{
                long size = response.ContentLength;
                using (Stream datastream = response.GetResponseStream())
                ...{
                    using (StreamReader sr = new StreamReader(datastream, System.Text.Encoding.Default))
                    ...{
                        result = sr.ReadToEnd();
                        sr.Close();
                    }

                    datastream.Close();
                }

                response.Close();
            }

            return result;
        }

        /**//// <summary>
        /// Gets the size of an FTP request
        /// </summary>
        /// <param name="ftp"></param>
        /// <returns></returns>
        /// <remarks></remarks>
        private long GetSize(FtpWebRequest ftp)
        ...{
            long size;
            using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse())
            ...{
                size = response.ContentLength;
                response.Close();
            }

            return size;
        }
        #endregion

        "Properties"#region "Properties"
        private string _hostname;
        /**//// <summary>
        /// Hostname
        /// </summary>
        /// <value></value>
        /// <remarks>Hostname can be in either the full URL format
        /// ftp://ftp.myhost.com or just ftp.myhost.com
        /// </remarks>
        public string Hostname
        ...{
            get
            ...{
                if (_hostname.StartsWith("ftp://"))
                ...{
                    return _hostname;
                }
                else
                ...{
                    return "ftp://" + _hostname;
                }
            }
            set
            ...{
                _hostname = value;
            }
        }
        private string _username;
        /**//// <summary>
        /// Username property
        /// </summary>
        /// <value></value>
        /// <remarks>Can be left blank, in which case 'anonymous' is returned</remarks>
        public string Username
        ...{
            get
            ...{
                return (_username == "" ? "anonymous" : _username);
            }
            set
            ...{
                _username = value;
            }
        }
        private string _password;
        public string Password
        ...{
            get
            ...{
                return _password;
            }
            set
            ...{
                _password = value;
            }
        }

        /**//// <summary>
        /// The CurrentDirectory value
        /// </summary>
        /// <remarks>Defaults to the root '/'</remarks>
        private string _currentDirectory = "/";
        public string CurrentDirectory
        ...{
            get
            ...{
                //return directory, ensure it ends with /
                return _currentDirectory + ((_currentDirectory.EndsWith("/")) ? "" : "/").ToString();
            }
            set
            ...{
                if (!value.StartsWith("/"))
                ...{
                    throw (new ApplicationException("Directory should start with /"));
                }
                _currentDirectory = value;
            }
        }


        #endregion

    }
    #endregion
    
    "FTP file info class"#region "FTP file info class"
    /**//// <summary>
    /// Represents a file or directory entry from an FTP listing
    /// </summary>
    /// <remarks>
    /// This class is used to parse the results from a detailed
    /// directory list from FTP. It supports most formats of
    /// </remarks>
    public class FTPfileInfo
    ...{
        
        //Stores extended info about FTP file
        
        "Properties"#region "Properties"
        public string FullName
        ...{
            get
            ...{
                return Path + Filename;
            }
        }
        public string Filename
        ...{
            get
            ...{
                return _filename;
            }
        }
        public string Path
        ...{
            get
            ...{
                return _path;
            }
        }
        public DirectoryEntryTypes FileType
        ...{
            get
            ...{
                return _fileType;
            }
        }
        public long Size
        ...{
            get
            ...{
                return _size;
            }
        }
        public DateTime FileDateTime
        ...{
            get
            ...{
                return _fileDateTime;
            }
        }
        public string Permission
        ...{
            get
            ...{
                return _permission;
            }
        }
        public string Extension
        ...{
            get
            ...{
                int i = this.Filename.LastIndexOf(".");
                if (i >= 0 && i <(this.Filename.Length - 1))
                ...{
                    return this.Filename.Substring(i + 1);
                }
                else
                ...{
                    return "";
                }
            }
        }
        public string NameOnly
        ...{
            get
            ...{
                int i = this.Filename.LastIndexOf(".");
                if (i > 0)
                ...{
                    return this.Filename.Substring(0, i);
                }
                else
                ...{
                    return this.Filename;
                }
            }
        }
        private string _filename;
        private string _path;
        private DirectoryEntryTypes _fileType;
        private long _size;
        private DateTime _fileDateTime;
        private string _permission;
        
        #endregion
        
        /**//// <summary>
        /// Identifies entry as either File or Directory
        /// </summary>
        public enum DirectoryEntryTypes
        ...{
            File,
            Directory
        }
        
        /**//// <summary>
        /// Constructor taking a directory listing line and path
        /// </summary>
        /// <param name="line">The line returned from the detailed directory list</param>
        /// <param name="path">Path of the directory</param>
        /// <remarks></remarks>
        public FTPfileInfo(string line, string path)
        ...{
            //parse line
            Match m = GetMatchingRegex(line);
            if (m == null)
            ...{
                //failed
                throw (new ApplicationException("Unable to parse line: " + line));
            }
            else
            ...{
                _filename = m.Groups["name"].Value;
                _path = path;

                Int64.TryParse(m.Groups["size"].Value, out _size);
                //_size = System.Convert.ToInt32(m.Groups["size"].Value);

                _permission = m.Groups["permission"].Value;
                string _dir = m.Groups["dir"].Value;
                if (_dir != "" && _dir != "-")
                ...{
                    _fileType = DirectoryEntryTypes.Directory;
                }
                else
                ...{
                    _fileType = DirectoryEntryTypes.File;
                }
                
                try
                ...{
                    _fileDateTime = DateTime.Parse(m.Groups["timestamp"].Value);
                }
                catch (Exception)
                ...{
                    _fileDateTime = Convert.ToDateTime(null);
                }
                
            }
        }
        
        private Match GetMatchingRegex(string line)
        ...{
            Regex rx;
            Match m;
            for (int i = 0; i <= _ParseFormats.Length - 1; i++)
            ...{
                rx = new Regex(_ParseFormats[i]);
                m = rx.Match(line);
                if (m.Success)
                ...{
                    return m;
                }
            }
            return null;
        }
        
        "Regular expressions for parsing LIST results"#region "Regular expressions for parsing LIST results"
        /**//// <summary>
        /// List of REGEX formats for different FTP server listing formats
        /// </summary>
        /// <remarks>
        /// The first three are various UNIX/LINUX formats, fourth is for MS FTP
        /// in detailed mode and the last for MS FTP in 'DOS' mode.
        /// I wish VB.NET had support for Const arrays like C# but there you go
        /// </remarks>
        private static string[] _ParseFormats = new string[] ...{ 
            "(?<dir>[/-d])(?<permission>([/-r][/-w][/-xs]){3})/s+/d+/s+/w+/s+/w+/s+(?<size>/d+)/s+(?<timestamp>/w+/s+/d+/s+/d{4})/s+(?<name>.+)", 
            "(?<dir>[/-d])(?<permission>([/-r][/-w][/-xs]){3})/s+/d+/s+/d+/s+(?<size>/d+)/s+(?<timestamp>/w+/s+/d+/s+/d{4})/s+(?<name>.+)", 
            "(?<dir>[/-d])(?<permission>([/-r][/-w][/-xs]){3})/s+/d+/s+/d+/s+(?<size>/d+)/s+(?<timestamp>/w+/s+/d+/s+/d{1,2}:/d{2})/s+(?<name>.+)", 
            "(?<dir>[/-d])(?<permission>([/-r][/-w][/-xs]){3})/s+/d+/s+/w+/s+/w+/s+(?<size>/d+)/s+(?<timestamp>/w+/s+/d+/s+/d{1,2}:/d{2})/s+(?<name>.+)", 
            "(?<dir>[/-d])(?<permission>([/-r][/-w][/-xs]){3})(/s+)(?<size>(/d+))(/s+)(?<ctbit>(/w+/s/w+))(/s+)(?<size2>(/d+))/s+(?<timestamp>/w+/s+/d+/s+/d{2}:/d{2})/s+(?<name>.+)", 
            "(?<timestamp>/d{2}/-/d{2}/-/d{2}/s+/d{2}:/d{2}[Aa|Pp][mM])/s+(?<dir>/</w+/>){0,1}(?<size>/d+){0,1}/s+(?<name>.+)" };
        #endregion
    }
    #endregion
    
    "FTP Directory class"#region "FTP Directory class"
    /**//// <summary>
    /// Stores a list of files and directories from an FTP result
    /// </summary>
    /// <remarks></remarks>
    public class FTPdirectory : List<FTPfileInfo>
    ...{
        
        
        public FTPdirectory()
        ...{
            //creates a blank directory listing
        }
        
        /**//// <summary>
        /// Constructor: create list from a (detailed) directory string
        /// </summary>
        /// <param name="dir">directory listing string</param>
        /// <param name="path"></param>
        /// <remarks></remarks>
        public FTPdirectory(string dir, string path)
        ...{
            foreach (string line in dir.Replace(" ", "").Split(System.Convert.ToChar(' ')))
            ...{
                //parse
                if (line != "")
                ...{
                    try
                    ...{
                        this.Add(new FTPfileInfo(line, path));
                    }
                    catch
                    ...{
                        continue;
                    }
                
                }
            }
        }
        
        /**//// <summary>
        /// Filter out only files from directory listing
        /// </summary>
        /// <param name="ext">optional file extension filter</param>
        /// <returns>FTPdirectory listing</returns>
        public FTPdirectory GetFiles(string ext)
        ...{
            return this.GetFileOrDir(FTPfileInfo.DirectoryEntryTypes.File, ext);
        }
        
        /**//// <summary>
        /// Returns a list of only subdirectories
        /// </summary>
        /// <returns>FTPDirectory list</returns>
        /// <remarks></remarks>
        public FTPdirectory GetDirectories()
        ...{
            return this.GetFileOrDir(FTPfileInfo.DirectoryEntryTypes.Directory, "");
        }
        
        //internal: share use function for GetDirectories/Files
        private FTPdirectory GetFileOrDir(FTPfileInfo.DirectoryEntryTypes type, string ext)
        ...{
            FTPdirectory result = new FTPdirectory();
            foreach (FTPfileInfo fi in this)
            ...{
                if (fi.FileType == type)
                ...{
                    if (ext == "")
                    ...{
                        result.Add(fi);
                    }
                    else if (ext == fi.Extension)
                    ...{
                        result.Add(fi);
                    }
                }
            }
            return result;
            
        }
        
        public bool FileExists(string filename)
        ...{
            foreach (FTPfileInfo ftpfile in this)
            ...{
                if (ftpfile.Filename == filename)
                ...{
                    return true;
                }
            }
            return false;
        }
        
        private const char slash = '/';
        
        public static string GetParentDirectory(string dir)
        ...{
            string tmp = dir.TrimEnd(slash);
            int i = tmp.LastIndexOf(slash);
            if (i > 0)
            ...{
                return tmp.Substring(0, i - 1);
            }
            else
            ...{
                throw (new ApplicationException("No parent for root"));
            }
        }
    }
    #endregion
    
}

.net 2.0 下的FTP搜索引擎实现相关推荐

  1. 转 FTP搜索引擎的设计与实现(优化版)

    width="336" height="280" src="http://www.zealware.com/csdnblog336280.html&q ...

  2. 在.net 2.0 中使用ftp

    摘要:本文简单的介绍了在.net 2.0下使用ftp的几种简单的方法,并提供了一个对FtpWebRequest封装的Ftp操作类 在.net 1.1中,如果我们要使用ftp,往往得借助一些第三方类库, ...

  3. 在Linux系统下建立强大的FTP搜索引擎

    Linux正大行其道,不少朋友相信已经用它架设过各种服务,什么Web.FTP.BBS等等等啦,这次,我向大家介绍另外一个在linux下运行的服务器软件----NoseyParker,一个强大的FTP搜 ...

  4. [转]FTP搜索引擎的设计与实现 1

    FTP搜索引擎的设计与实现 张运凯 刘宏忠 郭宏刚   摘要:FTP是因特网最主要的服务之一,FTP搜索引擎为人们使用FTP服务提供了很大的方便.本文分析和设计了一个基于WEB的FTP搜索引擎,并在P ...

  5. ubuntu下安装ftp服务器

    ubuntu下安装ftp服务器 Ftp服务器是使用以vsftp为例. 1. 安装     $sudo aptitude install vsftpd     $ps aux | grep 'ftp' ...

  6. 用C#实现FTP搜索引擎

    晚辈最近用C#写了一个教育网FTP搜索引擎,希望能得到高手的指点. 网址:http://soso.ccnu.com.cn      http://it.ccnu.edu.cn/soso 部分代码: u ...

  7. linux命令行下的ftp 多文件下载和目录下载

    目标ftp服务器是一个非标准端口的ftp 1.通过shell登录#ftp    //shell下输入ftp命令,进入到ftp提示符>open IP  PORT   //IP ,PORT对应为服务 ...

  8. Centos下搭建ftp服务器

    完全不用那么麻烦,直接可以用xshell中自带的传输文件功能,下载客户端xftp安装就行,不用配置,可以在windows系统向Linux系统的任何文件地方上传下载文件,简单方便,大大节约时间, vsf ...

  9. Ubuntu下架设FTP服务器(转)

    Ubuntu下架设FTP服务器 Linux下提供了很多的ftp服务器,这里我选用了安全,快速,简单的vsftpd作为FTP服务器.本文是我在自己的Ubuntu 10.10 -32 位系统下搭建的.搭建 ...

最新文章

  1. 使用XML作为配置表,WinForm程序读取配置表来动态显示控件
  2. moss得log文件不断增长的解决办法
  3. Docker Remote API使用准备
  4. python函数参数定义不合法_下列哪种函式参数定义不合法?
  5. php检测类是否存在,php判断类是否存在函数class_exists用法分析
  6. html(+css)/02/html标记语义应用,html列表与图片的应用
  7. python numba_如何用numba加速python?
  8. C++ union联合体基础说明及应用
  9. 尚硅谷SpringCloud Alibaba
  10. 22个月无休,华为36岁工程师在肯尼亚过劳猝死!
  11. 网络神采 网站数据采集软件
  12. 20 行 Python 代码批量抓取免费高清图片!
  13. 单字节的乘法指令设计汇编程序11*12
  14. hr面试性格测试30题_面试性格测试题60道
  15. 了解USB-HID协议
  16. NBMA和BMA的交换方式
  17. java制作闪星星_【治水】怎么用java画各种星星组成的图形
  18. input如何设置默认值
  19. Centos7配置环境变量导致大部分命令不可用
  20. ArcGIS 9.2 SP2 补丁开始提供下载

热门文章

  1. 测试开发知识总结------持续更新
  2. SO-Net:点云分析的自组织网络
  3. PROCESS_INFORMATION
  4. 计算机和通讯技术对我们生活的改变,信息技术的发展,带来了哪些方面的改变?...
  5. SMTP;ESMTP
  6. 数据库基础知识(八)
  7. 什么是IDC?IDC数据中心什么意思?
  8. hashmap头插法和尾插法区别
  9. 使用NanoHttpd在Android上实现HttpServer
  10. 【机器学习】有监督、无监督、自监督、半监督、弱监督的区别