将字符串或列表转换为 Renci.SshNet.Sftp

Convert string or list to Renci.SshNet.Sftp

我想从 SFTP 服务器(根目录和子目录)下载特定文件。我正在尝试从 SFTP 递归获取文件和子目录的列表,但我做不到。但是使用以下代码它只列出文件和目录名称。我正在尝试将目录路径添加到类型为 (Renci.SshNet.Sftp.SftpFile) 的目录中,但出现以下异常。

处理此问题的任何替代方法。

using (var sftp = new SftpClient(host, 22, username, password))
   {
      sftp.Connect();
      var directory = sftp.ListDirectory("/").ToList();
      string FileName = "Dir1/abc.txt,file1.txt,file2.txt"
      var fileNameList = FileName.Contains(',') ? FileName.Split(',') : String.IsNullOrEmpty(FileName) ? new string[0] : new string[1] { FileName };
      
      HashSet<string> filenameHash = new HashSet<string>(fileNameList.Select(x => x));
      directory.RemoveAll(x => !filenameHash.Contains(x.Name));
      directory.RemoveAll(x => (!x.IsRegularFile));
      
      string dir = "";
      
      SftpFile fl = (SftpFile)Convert.ChangeType(dir, typeof(SftpFile));
      
      foreach (var f  in fileNameList)
                {
                    if (f.Contains('/'))
                    {
                        fl += f;
                                
                    }
                }

            

异常:

System.InvalidCastException: 'Invalid cast from 'System.String' to 'Renci.SshNet.Sftp.SftpFile'.'

我只是通过连接(子目录到目录)并将其重新分配给目录来解决这个问题。

using (var sftp = new SftpClient(host, 22, username, password))
   {
      sftp.Connect();
      var directory = sftp.ListDirectory("/").ToList();
      string FileName = "Dir1/abc.txt,file1.txt,file2.txt"
      var fileNameList = FileName.Contains(',') ? FileName.Split(',') : String.IsNullOrEmpty(FileName) ? new string[0] : new string[1] { FileName };
      
      HashSet<string> filenameHash = new HashSet<string>(fileNameList.Select(x => x));
      directory.RemoveAll(x => !filenameHash.Contains(x.Name));
      directory.RemoveAll(x => (!x.IsRegularFile));
      
      string dir = "";
      
      SftpFile fl = (SftpFile)Convert.ChangeType(dir, typeof(SftpFile));
      
      foreach (var f  in fileNameList)
                {
                    if (f.Contains('/'))
                    {
                        string[] fl = f.Split("/");
                        var subdirectory = sftp.ListDirectory(f.Split('/')[0]).ToList();
                        directory = directory.Concat(subdirectory).ToList();
                    }
                }
 private void RecursivelyFilechecking(string Filepath, string _todaydate, string hostid, bool isHeader, string hostName, Int32 CustomerId)
        {
            try
            {
                
                if (_sftp.Exists(Filepath))
                {
                    var files = _sftp.ListDirectory(Filepath);
                    
                    bool flg = false;
                    string JobMailBody;
                    string toadd = string.Empty;
                    string fileName = string.Empty;
                    string fileDate = string.Empty;
                    Int32 filepathId = 0;
                   
                    foreach (var file in files)
                    {
                        if (file.IsDirectory && !file.Name.Equals(".") && !file.Name.Equals(".."))
                        {
                           
                            RecursivelyFilechecking(file.FullName, _todaydate, hostid, isHeader, hostName, CustomerId);
                        }
                        else if (!file.Name.Equals(".") && !file.Name.Equals(".."))
                        {
                          
                            if (file.LastWriteTime.ToString("ddMMyyyy").Equals(_todaydate))
                            {

                    
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                
            }
        }