private void SFTPOpenDirectory_Core(string fullPath, bool expand) { Log("Retrieving directory entries...: " + fullPath); SFTPFileInfo[] entries = _sftp.GetDirectoryEntries(fullPath); for (int i = 0; i < entries.Length; i++) { SFTPFileInfo ent = entries[i]; if (UnixPermissions.IsSymbolicLink(ent.Permissions)) { // If the symbolic link points a directory, // replace the file information so as to open the node. string path = CombineUnixPath(fullPath, ent.FileName); SFTPFileAttributes attr; try { attr = _sftp.GetFileInformations(path, false); } catch (SFTPClientException e) { if (!IsSFTPError(e, SFTPStatusCode.SSH_FX_NO_SUCH_FILE)) throw; // file missing or dead symbolic link ? attr = null; } if (attr != null) { if (UnixPermissions.IsDirectory(attr.Permissions)) { entries[i] = new SFTPFileInfo(ent.FileName, ent.LongName, attr); } } } } this.Invoke((MethodInvoker)delegate() { treeViewRemote.BeginUpdate(); TreeNode dirNode = MakeDirectoryTree(fullPath, expand); UpdateTreeDirectoryEntries(dirNode, entries); dirNode.EnsureVisible(); treeViewRemote.EndUpdate(); }); Log("...Done"); }
private void UpdateTreeDirectoryEntries(TreeNode directoryNode, SFTPFileInfo[] entries) { TreeNodeCollection children = directoryNode.Nodes; Dictionary<string, SFTPFileInfo> newEntries = new Dictionary<string, SFTPFileInfo>(); foreach (SFTPFileInfo ent in entries) { if (IsDots(ent.FileName)) continue; newEntries.Add(ent.FileName, ent); } List<TreeNode> nodesToDelete = new List<TreeNode>(); foreach (TreeNode node in children) { if (!newEntries.ContainsKey(node.Name)) { nodesToDelete.Add(node); } } foreach (TreeNode node in nodesToDelete) { children.Remove(node); } foreach (SFTPFileInfo ent in entries) { if (IsDots(ent.FileName)) continue; TreeNode entNode = children[ent.FileName]; if (entNode == null) { entNode = CreateFileOrDirectoryNode(ent); children.Add(entNode); } else { UpdateTreeNode(entNode, ent); } } }
private string GetTooltipText(SFTPFileInfo fileInfo) { return new StringBuilder() .Append(UnixPermissions.Format(fileInfo.Permissions)) .Append(' ') .Append(fileInfo.FileSize) .Append(' ') .Append(fileInfo.FileName) .ToString(); }
private TreeNode CreateFileOrDirectoryNode(SFTPFileInfo fileInfo) { NodeTag nodeTag = NodeTag.CreateForFileOrDirectory(fileInfo); int iconIndex = GetNodeImageIndex(nodeTag.Type); TreeNode node = new TreeNode(fileInfo.FileName, iconIndex, iconIndex); node.Name = fileInfo.FileName; // TreeNodeCollection uses this as a key. node.Tag = nodeTag; node.ToolTipText = GetTooltipText(fileInfo); return node; }
public static NodeTag CreateForFileOrDirectory(SFTPFileInfo fileInfo) { NodeType nodeType; string prefix; if (UnixPermissions.IsDirectory(fileInfo.Permissions)) { nodeType = NodeType.Directory; prefix = "D:"; } else if (UnixPermissions.IsSymbolicLink(fileInfo.Permissions)) { nodeType = NodeType.SymbolicLink; prefix = "F:"; } else { nodeType = NodeType.File; prefix = "F:"; } return new NodeTag(nodeType, prefix + fileInfo.FileName, fileInfo); }
private NodeTag(NodeType nodeType, string sortKey, SFTPFileInfo fileInfo) { this.Type = nodeType; this.SortKey = sortKey; this.FileInfo = fileInfo; }
private void UpdateTreeNode(TreeNode node, SFTPFileInfo fileInfo) { NodeTag nodeTag = NodeTag.CreateForFileOrDirectory(fileInfo); node.SelectedImageIndex = node.ImageIndex = GetNodeImageIndex(nodeTag.Type); node.Tag = nodeTag; node.ToolTipText = GetTooltipText(fileInfo); }