如何使用WinSCP和C#从远程目录添加树视图的节点作为文件夹

时间:2016-04-13 21:44:09

标签: c# .net treeview directory-structure winscp

我正在尝试使用FTP / SFTP连接创建树视图以在远程服务器中搜索目录,我正在尝试做的是从主目录开始填充所有可用目录的树视图例如以下示例:

Home---->SubFolder
    |
    |---->Another Folder
    |
    |---->MyOtherFolder

然后,当用户开始在每个文件夹中单击时,它开始从树视图中显示其子目录,如下面的示例(单击另一个文件夹):

Home ---->SubFolder
     |
     |---->Another Folder -------> MyFolder1
     |                  | -------> MyFolder2
     |
     |---->MyOtherFolder 

我正在尝试获取这些文件夹,但它正在抛出异常,它也在收集文件,而不是文件夹....

这是我的代码......

private void FillTree()
{
   SessionOptions SessionOptions = new SessionOptions();
   Session MySession = new Session();

   SessionOptions.HostName = InterfaceValues[0];
   SessionOptions.UserName = InterfaceValues[2];
   SessionOptions.Password = InterfaceValues[3];
   SessionOptions.PortNumber = Convert.ToInt32(InterfaceValues[1]);

   if (string.Compare(InterfaceValues[9], "FTP", true) == 0)
       SessionOptions.Protocol = WinSCP.Protocol.Ftp;
   else if (string.Compare(InterfaceValues[9], "SFTP", true) == 0)
   {
        SessionOptions.Protocol = WinSCP.Protocol.Sftp;
        SessionOptions.SshPrivateKeyPath = InterfaceValues[12];
        SessionOptions.SshHostKeyFingerprint = InterfaceValues[10];
   }

   try
   {
       MySession.Open(SessionOptions);

       foreach (RemoteFileInfo info in MySession.EnumerateRemoteFiles("/", "*",  EnumerationOptions.AllDirectories))
       {
          if (info.IsDirectory)
             tvRemoteDirectory.Nodes.Add(info.Name);
       }

   MySession.Close();
}
catch (Exception ex)
{
     MySession.Close();
     MessageBox.Show("Not possible to connect to " + InterfaceValues[0] + "\nError Message: " + ex.Message);
      this.Close();
}

我得到的例外是:

{WinSCP.SessionRemoteException: Error listing directory '/jpm_icl'. ---> WinSCP.SessionRemoteException: Permission denied. Error code: 3 Error message from server: Permission Denied!

知道我现在该怎么办?

2 个答案:

答案 0 :(得分:1)

我做的是:

ListDirectory函数检索所有目录,因为我不希望目录“。”和“。”我必须排除它。

RemoteDirectoryInfo RemoteDirectory;

     if (RemoteDirectoryPath != "Home")
          RemoteDirectory  = MySession.ListDirectory(RemoteDirectoryPath);
     else
          RemoteDirectory = MySession.ListDirectory("/");
     if (tvRemoteDirectory.SelectedNode.Nodes.Count > 0) tvRemoteDirectory.SelectedNode.Nodes.Clear();

     foreach (RemoteFileInfo fileinfo in RemoteDirectory.Files)
     {                    
        if (fileinfo.IsDirectory)
        {
           if (fileinfo.Name != "." &&
               fileinfo.Name != "..")
               {                                                    
                   TreeNode ChildNode = new TreeNode();
                   ChildNode.Text = fileinfo.Name;
                   ChildNode.ImageIndex = 0;                                                     
                   tvRemoteDirectory.SelectedNode.Nodes.Add(ChildNode);
                   tvRemoteDirectory.ExpandAll();
               }          
         }                    
     }

答案 1 :(得分:-1)

使用RadFileExplorer - Telerik ASP.NET FileExplorer

此功能将完成您​​的要求FileExplorer - Show all items in the TreeView

所有其他主要功能如下您希望

  

来自Telerik,您可以在任何平台上获得此功能。

  • 集成在Telerik.Web.UI中的单个控件 - 可以在页面上拖放

  • 使用ASP.NET 2.0 AJAX回调机制加载按需加载目录

  • 文件操作的客户端和服务器事件

  • 使用RadEditor的FileBrowserContentProvider抽象来连接任何底层文件系统,例如操作系统,数据库,MOSS SharePoint,MCMS

  • 文件和文件夹的排序

  • 上下文菜单

  • 能够删除和重命名文件和文件夹

  • 能够创建新文件夹

  • 如果文件夹包含大量项目(例如超过200个),则能够为网格启用分页

  • 能够使用新的工具栏按钮

  • 在网格和缩略图视图之间快速切换