1

我正在创建一个需要 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;
    }
}
4

2 回答 2

1

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

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

于 2012-08-16T14:29:02.970 回答
0

这是类似的替代实现。我已经用多达 1000 个 ftp 文件对此进行了测试,它可能对你有用。完整的源代码可以在这里找到。

    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;
    }
于 2012-08-16T15:36:29.193 回答