使用FTP从目录中检索特定文件

时间:2012-08-16 13:47:33

标签: c# ftp

我正在创建一个需要FTP到目录的C#应用​​程序来检索文件列表。以下代码工作得很好。但是,我正在FTP的文件夹包含大约92,000个文件。此代码将无法以我希望的方式用于该大小的文件列表。

我只查找以字符串“c-”开头的文件。在做了一些研究后,我甚至不确定如何开始尝试解决这个问题。有什么办法可以修改现有的代码,只检索那些文件吗?

public string[] getFileList() {
    string[] downloadFiles;
    StringBuilder result = new StringBuilder();
    FtpWebRequest reqFTP;

    try {
        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpHost));
        reqFTP.UseBinary = true;
        reqFTP.Credentials = new NetworkCredential(ftpUser, ftpPass);
        reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
        WebResponse response = reqFTP.GetResponse();
        StreamReader reader = new StreamReader(response.GetResponseStream());

        string line = reader.ReadLine();
        while (line != null) {
            result.Append(line);
            result.Append("\n");
            line = reader.ReadLine();
        }
        // to remove the trailing '\n'
        result.Remove(result.ToString().LastIndexOf('\n'), 1);
        reader.Close();
        response.Close();
        return result.ToString().Split('\n');
    }
    catch (Exception ex) {
        System.Windows.Forms.MessageBox.Show(ex.Message);
        downloadFiles = null;
        return downloadFiles;
    }
}

2 个答案:

答案 0 :(得分:1)

我认为LIST不支持通配符搜索,实际上它可能因不同的FTP平台而异,并且取决于命令支持

您需要使用LIST下载FTP目录中的所有文件名,可能是以异步方式。

答案 1 :(得分:0)

这是沿类似路线的替代实施方式。我用多达1000 ftp的文件对它进行了测试,它可能对你有用。完整的源代码可以找到here

    public List<ftpinfo> browse(string path) //eg: "ftp.xyz.org", "ftp.xyz.org/ftproot/etc"
    {
        FtpWebRequest request=(FtpWebRequest)FtpWebRequest.Create(path);
        request.Method=WebRequestMethods.Ftp.ListDirectoryDetails;
        List<ftpinfo> files=new List<ftpinfo>();

        //request.Proxy = System.Net.WebProxy.GetDefaultProxy();
        //request.Proxy.Credentials = CredentialCache.DefaultNetworkCredentials;
        request.Credentials = new NetworkCredential(_username, _password);
        Stream rs=(Stream)request.GetResponse().GetResponseStream();

        OnStatusChange("CONNECTED: " + path, 0, 0);

        StreamReader sr = new StreamReader(rs);
        string strList = sr.ReadToEnd();
        string[] lines=null;

        if (strList.Contains("\r\n"))
        {
            lines=strList.Split(new string[] {"\r\n"},StringSplitOptions.None);
        }
        else if (strList.Contains("\n"))
        {
            lines=strList.Split(new string[] {"\n"},StringSplitOptions.None);
        }

        //now decode this string array

        if (lines==null || lines.Length == 0)
            return null;

        foreach(string line in lines)
        {
            if (line.Length==0)
                continue;
            //parse line
            Match m= GetMatchingRegex(line);
            if (m==null) {
                //failed
                throw new ApplicationException("Unable to parse line: " + line);
            }

            ftpinfo item=new ftpinfo();
            item.filename = m.Groups["name"].Value.Trim('\r');
            item.path = path;
            item.size = Convert.ToInt64(m.Groups["size"].Value);
            item.permission = m.Groups["permission"].Value;
            string _dir = m.Groups["dir"].Value;
            if(_dir.Length>0  && _dir != "-")
            {
                item.fileType = directoryEntryTypes.directory;
            } 
            else
            {
                item.fileType = directoryEntryTypes.file;
            }

            try
            {
                item.fileDateTime = DateTime.Parse(m.Groups["timestamp"].Value);
            }
            catch
            {
                item.fileDateTime = DateTime.MinValue; //null;
            }

            files.Add(item);
        }

        return files;
    }