Quantcast
Channel: Windows Forms Data Controls and Databinding forum
Viewing all articles
Browse latest Browse all 2535

How can i get also the files in the root directory and how can i for testing add items of IEnumerable to List ?

$
0
0

What i get is only the directories and files that in other nodes. But i have also files on the root directory and i never get them. This is a screenshot of my program after i got the content of my ftp. I'm using treeView to display my ftp content:

You can see two directories from the root but no files on the root it self. And in my ftp server host i have files in the root direcory.

This is the method i'm using to get the directory listing:

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();
                        var size = split.Groups["size"].Length;
                        myresult.Add(new FTPListDetail()
                        {
                            Dir = dir,
                            Filecode = filecode,
                            Group = group,
                            FullPath = CurrentRemoteDirectory + "/" + filename,
                            Name = filename,
                            Owner = owner,
                            Permission = permission,
                        });
                    };
                    return myresult;
                }
            }
        }

And then this method to loop over and listing :

private int total_dirs;
        private int searched_until_now_dirs;
        private int max_percentage;
        private TreeNode directories_real_time;
        private string SummaryText;

        private TreeNode CreateDirectoryNode(string path, string name , int recursive_levl )
        {

            var directoryNode = new TreeNode(name);
            var directoryListing = GetDirectoryListing(path);

            var directories = directoryListing.Where(d => d.IsDirectory);
            var files = directoryListing.Where(d => !d.IsDirectory);
            total_dirs += directories.Count<FTPListDetail>();
            searched_until_now_dirs++;

            int percentage = 0;

            foreach (var dir in directories)
            {

                directoryNode.Nodes.Add(CreateDirectoryNode(dir.FullPath, dir.Name, recursive_levl+1));

                if (recursive_levl == 1)
                {
                    TreeNode temp_tn = (TreeNode)directoryNode.Clone();

                    this.BeginInvoke(new MethodInvoker( delegate
                    {
                            UpdateList(temp_tn);
                    }));
                }
                    percentage = (searched_until_now_dirs * 100) / total_dirs;
                    if (percentage > max_percentage)
                    {
                        SummaryText = String.Format("Searched dirs {0} / Total dirs {1}", searched_until_now_dirs, total_dirs);
                        max_percentage = percentage;
                        backgroundWorker1.ReportProgress(percentage, SummaryText);
                    }
            }
                percentage = (searched_until_now_dirs * 100) / total_dirs;
                if (percentage > max_percentage)
                {
                    SummaryText = String.Format("Searched dirs {0} / Total dirs {1}", searched_until_now_dirs, total_dirs);
                    max_percentage = percentage;
                    backgroundWorker1.ReportProgress(percentage, SummaryText);
                }
            foreach (var file in files)
            {
                TreeNode file_tree_node = new TreeNode(file.Name);
                file_tree_node.Tag = "file" ;

                directoryNode.Nodes.Add(file_tree_node);
                numberOfFiles.Add(file.FullPath);
            }



            return directoryNode;
        }

Then updating the treeView:

DateTime last_update;
        private void UpdateList(TreeNode tn_rt)
        {
            TimeSpan ts = DateTime.Now - last_update;
            if (ts.TotalMilliseconds > 200)
            {
                last_update = DateTime.Now;
                treeViewMS1.BeginUpdate();
                treeViewMS1.Nodes.Clear();
                treeViewMS1.Nodes.Add(tn_rt);
                ExpandToLevel(treeViewMS1.Nodes, 1);
                treeViewMS1.EndUpdate();
            }

        }

And inside a backgroundworker do work how i'm using it:

var root = Convert.ToString(e.Argument);
var dirNode = CreateDirectoryNode(root, "root", 1);
e.Result = dirNode;

And last the FTPListDetail class:

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; }
        }

Now the main problem is that when i list the files and directories and display them in the treeView it dosen't get/display the files in the root directory. Only in the sub nodes.

I will see the files inside hello and stats but i need also to see the files in the root directory.

1. How can i get and list/display the files of the root directory ?

2. For the test i tried to add to a List<string> the items in var files to see if i get the root files at all.

   This is what i tried in the CreateDirectoryNode before it i added:

private List<string> testfiles = new List<string>();

Then after var files i did:

testfiles.Add(files.ToList()

But this is wrong. I just wanted to see in testfiles what items i'm getting in var files in the end of the process.

Both var files and directoryListing are IEnumerable<FTPListDetail> type.

The most important is to make the number 1 i mentioned and then to do number 2.


Viewing all articles
Browse latest Browse all 2535

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>