简体   繁体   English

如何使用C#在树形视图中显示ftp中的所有文件和文件夹?

[英]How to display all the files & folders from ftp in tree view using c#?

I am doing windows application, in that application I need to display the all the files and folder from FTP in tree view. 我正在执行Windows应用程序,在该应用程序中,我需要以树状视图显示FTP中的所有文件和文件夹。

I did some of the sample code which is, 我做了一些示例代码,

private void button1_Click(object sender, EventArgs e)
{
    var root = "ftp://creeddemo.in";

    treeView1.Nodes.Clear();
    treeView1.Nodes.Add(CreateDirectoryNode(root, "ftp:/xxxxxxx.in/"));

}


private TreeNode CreateDirectoryNode(string root, string p)
{
    var directoryNode = new TreeNode(name);
    var directoryListing = GetDirectoryListing(path);

    var directories = directoryListing.Where(d => d.IsDirectory);
    var files = directoryListing.Where(d => !d.IsDirectory);

    foreach (var dir in directories)
    {
        directoryNode.Nodes.Add(CreateDirectoryNode(dir.FullPath, dir.Name));
    }
    foreach (var file in files)
    {
        directoryNode.Nodes.Add(new TreeNode(file.Name));
    }
    return directoryNode;
}

public IEnumerable<FTPListDetail> GetDirectoryListing(string rootUri)
{
    var CurrentRemoteDirectory = rootUri;
    var result = new StringBuilder();

    var request = GetWebRequest(WebRequestMethods.Ftp.ListDirectoryDetails, CurrentRemoteDirectory);

    using (var response = request.GetResponse())
    {
        using (var reader = new StreamReader(response.GetResponseStream()))
        {
            string line = reader.ReadLine();
            while (line != null)
            {
                result.Append(line);
                result.Append("\n");
                line = reader.ReadLine();
            }
            if (string.IsNullOrEmpty(result.ToString()))
            {
                return new List<FTPListDetail>();
            }
            result.Remove(result.ToString().LastIndexOf("\n"), 1);
            var results = result.ToString().Split('\n');
            string regex =
                @"^" +               //# Start of line
                @"(?<dir>[\-ld])" +          //# File size          
                @"(?<permission>[\-rwx]{9})" +            //# Whitespace          \n
                @"\s+" +            //# Whitespace          \n
                @"(?<filecode>\d+)" +
                @"\s+" +            //# Whitespace          \n
                @"(?<owner>\w+)" +
                @"\s+" +            //# Whitespace          \n
                @"(?<group>\w+)" +
                @"\s+" +            //# Whitespace          \n
                @"(?<size>\d+)" +
                @"\s+" +            //# Whitespace          \n
                @"(?<month>\w{3})" +          //# Month (3 letters)   \n
                @"\s+" +            //# Whitespace          \n
                @"(?<day>\d{1,2})" +        //# Day (1 or 2 digits) \n
                @"\s+" +            //# Whitespace          \n
                @"(?<timeyear>[\d:]{4,5})" +     //# Time or year        \n
                @"\s+" +            //# Whitespace          \n
                @"(?<filename>(.*))" +            //# Filename            \n
                @"$";                //# End of line

            var myresult = new List<FTPListDetail>();
            foreach (var parsed in results)
            {
                var split = new Regex(regex)
                    .Match(parsed);
                var dir = split.Groups["dir"].ToString();
                var permission = split.Groups["permission"].ToString();
                var filecode = split.Groups["filecode"].ToString();
                var owner = split.Groups["owner"].ToString();
                var group = split.Groups["group"].ToString();
                var filename = split.Groups["filename"].ToString();
                myresult.Add(new FTPListDetail()
                {
                    Dir = dir,
                    Filecode = filecode,
                    Group = group,
                    FullPath = CurrentRemoteDirectory + "/" + filename,
                    Name = filename,
                    Owner = owner,
                    Permission = permission,
                });
            };
            return myresult;
        }
    }
}

private System.Net.FtpWebRequest GetWebRequest (string method, string uri)
{

    Uri serverUri = new Uri (uri);

   //here I am getting error (An unhandled exception of type
   //--> 'System.ArgumentNullException' occurred in System.dll) <--

    if (serverUri.Scheme != Uri.UriSchemeFtp)
    {
        return null;
    }
    var reqFTP = (FtpWebRequest)FtpWebRequest.Create(serverUri);
    reqFTP.Method = method;
    reqFTP.UseBinary = true;
    reqFTP.Credentials = new NetworkCredential("aaaa", "bbbbbb@1234");
    reqFTP.Proxy = null;
    reqFTP.KeepAlive = false;
    reqFTP.UsePassive = false;
    return reqFTP;
}

Help me out of here 帮我离开这里

Of course you have to replace the Value of "root" with the rootURL of your FTP-Server and in the Method GetWebRequest() replace "username" and "password" with your Credentials! 当然,您必须用FTP服务器的rootURL替换“ root”的值,并在GetWebRequest()方法中用凭据替换“ username”和“ password”!

You need this Class to Hold Details 您需要此类来保存详细信息

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

and here is the Code-Behind for your WinForm-App 这是您的WinForm-App的代码隐藏

private void button1_Click(object sender, EventArgs e)
{
    var root = "ftp://ftp.yourFTPServer.at";

    treeView1.Nodes.Clear();
    treeView1.Nodes.Add(CreateDirectoryNode(root, "root"));
}

private TreeNode CreateDirectoryNode(string path, string name)
{
    var directoryNode = new TreeNode(name);
    var directoryListing = GetDirectoryListing(path);

    var directories = directoryListing.Where(d => d.IsDirectory);
    var files = directoryListing.Where(d => !d.IsDirectory);

    foreach (var dir in directories)
    {
        directoryNode.Nodes.Add(CreateDirectoryNode(dir.FullPath, dir.Name));
    }
    foreach (var file in files)
    {
            directoryNode.Nodes.Add(new TreeNode(file.Name));
    }
    return directoryNode;
}

public IEnumerable<FTPListDetail> GetDirectoryListing(string rootUri)
{
    var CurrentRemoteDirectory = rootUri;
    var result = new StringBuilder();
    var request = GetWebRequest(WebRequestMethods.Ftp.ListDirectoryDetails, CurrentRemoteDirectory);
    using (var response = request.GetResponse())
    {
        using (var reader = new StreamReader(response.GetResponseStream()))
        {
            string line = reader.ReadLine();
            while (line != null)
            {
                result.Append(line);
                result.Append("\n");
                line = reader.ReadLine();
            }
            if (string.IsNullOrEmpty(result.ToString()))
            {
                return new List<FTPListDetail>();
            }
            result.Remove(result.ToString().LastIndexOf("\n"), 1);
            var results = result.ToString().Split('\n');
            string regex =
                @"^" +               //# Start of line
                @"(?<dir>[\-ld])" +          //# File size          
                @"(?<permission>[\-rwx]{9})" +            //# Whitespace          \n
                @"\s+" +            //# Whitespace          \n
                @"(?<filecode>\d+)" +
                @"\s+" +            //# Whitespace          \n
                @"(?<owner>\w+)" +
                @"\s+" +            //# Whitespace          \n
                @"(?<group>\w+)" +
                @"\s+" +            //# Whitespace          \n
                @"(?<size>\d+)" +
                @"\s+" +            //# Whitespace          \n
                @"(?<month>\w{3})" +          //# Month (3 letters)   \n
                @"\s+" +            //# Whitespace          \n
                @"(?<day>\d{1,2})" +        //# Day (1 or 2 digits) \n
                @"\s+" +            //# Whitespace          \n
                @"(?<timeyear>[\d:]{4,5})" +     //# Time or year        \n
                @"\s+" +            //# Whitespace          \n
                @"(?<filename>(.*))" +            //# Filename            \n
                @"$";                //# End of line

            var myresult = new List<FTPListDetail>();
            foreach (var parsed in results)
            {
                var split = new Regex(regex)
                    .Match(parsed);
                var dir = split.Groups["dir"].ToString();
                var permission = split.Groups["permission"].ToString();
                var filecode = split.Groups["filecode"].ToString();
                var owner = split.Groups["owner"].ToString();
                var group = split.Groups["group"].ToString();
                var filename = split.Groups["filename"].ToString();
                myresult.Add(new FTPListDetail()
                {
                    Dir = dir,
                    Filecode = filecode,
                    Group = group,
                    FullPath = CurrentRemoteDirectory + "/" + filename,
                    Name = filename,
                    Owner = owner,
                    Permission = permission,
                });
            };
            return myresult;
        }
    }
}

private FtpWebRequest GetWebRequest(string method, string uri)
{
    Uri serverUri = new Uri(uri);
    if (serverUri.Scheme != Uri.UriSchemeFtp)
    {
        return null;
    }
    var reqFTP = (FtpWebRequest)FtpWebRequest.Create(serverUri);
    reqFTP.Method = method;
    reqFTP.UseBinary = true;
    reqFTP.Credentials = new NetworkCredential("yourUser", "yourPassword");
    reqFTP.Proxy = null;
    reqFTP.KeepAlive = false;
    reqFTP.UsePassive = false;
    return reqFTP;
}

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM