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.