Example #1
0
        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");
        }
Example #2
0
        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);
                }
            }
        }
Example #3
0
 private string GetTooltipText(SFTPFileInfo fileInfo)
 {
     return new StringBuilder()
         .Append(UnixPermissions.Format(fileInfo.Permissions))
         .Append(' ')
         .Append(fileInfo.FileSize)
         .Append(' ')
         .Append(fileInfo.FileName)
         .ToString();
 }
Example #4
0
 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;
 }
Example #5
0
 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);
 }
Example #6
0
 private NodeTag(NodeType nodeType, string sortKey, SFTPFileInfo fileInfo)
 {
     this.Type = nodeType;
     this.SortKey = sortKey;
     this.FileInfo = fileInfo;
 }
Example #7
0
 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);
 }