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 のサポートに依存する可能性があります。

LISTを使用して、おそらく非同期の方法で、FTP ディレクトリ内のすべてのファイル名をダウンロードする必要があります。

于 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 に答える