C# 使用 FTP 服务器目录填充 TreeView

Fre*_*red 1 c# ftp

我在网上搜索过,对此仍然很陌生。请对我有一些耐心。

我想做的是: - 我有一个名为“treeTO”的 TreeView。- 我连接到我的 FTP 服务器,并且想要在树视图中填充此处的所有内容(目录、子目录和文件,无论是什么)。- 这是我到目前为止的代码:

FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://" + ActiveServer.Server + "/");
request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
request.Credentials = new NetworkCredential(ActiveServer.UserName, ActiveServer.Password);
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
Run Code Online (Sandbox Code Playgroud)

-这将返回以下文本:日志、数据和 WwwRoot。

我很难将其添加到树视图中,然后循环遍历文件夹以将所有内容添加到树视图中。

mak*_*kim 5

所以这里\xc2\xb4s是我为你提供的工作解决方案!

\n\n

当然,您必须将“root”的值替换为 FTP 服务器的 rootURL,并在方法 GetWebRequest() 中将“用户名”和“密码”替换为您的凭据!

\n\n

您需要这个类来保存详细信息

\n\n
public class FTPListDetail\n{\n        public bool IsDirectory\n        {\n            get\n            {\n                return !string.IsNullOrWhiteSpace(Dir) && Dir.ToLower().Equals("d");\n            }\n        }\n        internal string Dir { get; set; }\n        public string Permission { get; set; }\n        public string Filecode { get; set; }\n        public string Owner { get; set; }\n        public string Group { get; set; }\n        public string Name { get; set; }\n        public string FullPath { get; set; }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是您的 WinForm 应用程序的代码隐藏

\n\n
private void button1_Click(object sender, EventArgs e)\n{\n    var root = "ftp://ftp.yourFTPServer.at";\n\n    treeView1.Nodes.Clear();\n    treeView1.Nodes.Add(CreateDirectoryNode(root, "root"));\n}\n\nprivate TreeNode CreateDirectoryNode(string path, string name)\n{\n    var directoryNode = new TreeNode(name);\n    var directoryListing = GetDirectoryListing(path);\n\n    var directories = directoryListing.Where(d => d.IsDirectory);\n    var files = directoryListing.Where(d => !d.IsDirectory);\n\n    foreach (var dir in directories)\n    {\n        directoryNode.Nodes.Add(CreateDirectoryNode(dir.FullPath, dir.Name));\n    }\n    foreach (var file in files)\n    {\n            directoryNode.Nodes.Add(new TreeNode(file.Name));\n    }\n    return directoryNode;\n}\n\npublic IEnumerable<FTPListDetail> GetDirectoryListing(string rootUri)\n{\n    var CurrentRemoteDirectory = rootUri;\n    var result = new StringBuilder();\n    var request = GetWebRequest(WebRequestMethods.Ftp.ListDirectoryDetails, CurrentRemoteDirectory);\n    using (var response = request.GetResponse())\n    {\n        using (var reader = new StreamReader(response.GetResponseStream()))\n        {\n            string line = reader.ReadLine();\n            while (line != null)\n            {\n                result.Append(line);\n                result.Append("\\n");\n                line = reader.ReadLine();\n            }\n            if (string.IsNullOrEmpty(result.ToString()))\n            {\n                return new List<FTPListDetail>();\n            }\n            result.Remove(result.ToString().LastIndexOf("\\n"), 1);\n            var results = result.ToString().Split(\'\\n\');\n            string regex =\n                @"^" +               //# Start of line\n                @"(?<dir>[\\-ld])" +          //# File size          \n                @"(?<permission>[\\-rwx]{9})" +            //# Whitespace          \\n\n                @"\\s+" +            //# Whitespace          \\n\n                @"(?<filecode>\\d+)" +\n                @"\\s+" +            //# Whitespace          \\n\n                @"(?<owner>\\w+)" +\n                @"\\s+" +            //# Whitespace          \\n\n                @"(?<group>\\w+)" +\n                @"\\s+" +            //# Whitespace          \\n\n                @"(?<size>\\d+)" +\n                @"\\s+" +            //# Whitespace          \\n\n                @"(?<month>\\w{3})" +          //# Month (3 letters)   \\n\n                @"\\s+" +            //# Whitespace          \\n\n                @"(?<day>\\d{1,2})" +        //# Day (1 or 2 digits) \\n\n                @"\\s+" +            //# Whitespace          \\n\n                @"(?<timeyear>[\\d:]{4,5})" +     //# Time or year        \\n\n                @"\\s+" +            //# Whitespace          \\n\n                @"(?<filename>(.*))" +            //# Filename            \\n\n                @"$";                //# End of line\n\n            var myresult = new List<FTPListDetail>();\n            foreach (var parsed in results)\n            {\n                var split = new Regex(regex)\n                    .Match(parsed);\n                var dir = split.Groups["dir"].ToString();\n                var permission = split.Groups["permission"].ToString();\n                var filecode = split.Groups["filecode"].ToString();\n                var owner = split.Groups["owner"].ToString();\n                var group = split.Groups["group"].ToString();\n                var filename = split.Groups["filename"].ToString();\n                myresult.Add(new FTPListDetail()\n                {\n                    Dir = dir,\n                    Filecode = filecode,\n                    Group = group,\n                    FullPath = CurrentRemoteDirectory + "/" + filename,\n                    Name = filename,\n                    Owner = owner,\n                    Permission = permission,\n                });\n            };\n            return myresult;\n        }\n    }\n}\n\nprivate FtpWebRequest GetWebRequest(string method, string uri)\n{\n    Uri serverUri = new Uri(uri);\n    if (serverUri.Scheme != Uri.UriSchemeFtp)\n    {\n        return null;\n    }\n    var reqFTP = (FtpWebRequest)FtpWebRequest.Create(serverUri);\n    reqFTP.Method = method;\n    reqFTP.UseBinary = true;\n    reqFTP.Credentials = new NetworkCredential("yourUser", "yourPassword");\n    reqFTP.Proxy = null;\n    reqFTP.KeepAlive = false;\n    reqFTP.UsePassive = false;\n    return reqFTP;\n}\n
Run Code Online (Sandbox Code Playgroud)\n