检查Remote文件夹是否存在 - Renci.ssh

时间:2015-04-06 11:22:02

标签: c# ssh

我想在列出其中的文件之前检查是否存在远程文件夹。 但是这段代码给了我SftpPathNotFoundException : No such file

我知道正在检查的文件夹不存在,这就是我想要处理它的原因。

var sftp = new SftpClient(sftpHost, username, password);
string sftpPath30s = "/home/Vendors/clips/1/4/4";

if (sftp.Exists(sftpPath30s))
   {
     var files30s = sftp.ListDirectory(sftpPath30s); //error here
     if(files30s!=null)
       {
          Console.writeline("code doesn't reach here");
       }
   }

此代码适用于其他现有文件夹,例如" / home / Vendors / clips / 1/4/3"等

2 个答案:

答案 0 :(得分:1)

在这种情况下,sftp.Exists()方法会给出误报,如果找到目录的一部分,它就会返回true,即使并非所有路径都存在。 我建议将你的代码更改为:

 if (IsDirectoryExist(sftpPath30s))
   {
     var files30s = sftp.ListDirectory(sftpPath30s); 

   }
else
{
     //Do what you want
}

然后是方法'IsDirectoryExists':

     private bool IsDirectoryExists(string path)
    {
        bool isDirectoryExist = false;

        try
        {
            sftp.ChangeDirectory(path);
            isDirectoryExist = true;
        }
        catch (SftpPathNotFoundException)
        {
            return false;
        }
        return isDirectoryExist;
    }

不要忘记更改您正在处理的目录,以防它遇到问题!

答案 1 :(得分:1)

mu

可以说存在这样一种方法。那怎么办?

parse_document

可以吗?

Most Certainly Not!

如果在检查文件是否存在与实际获取文件之间删除或移动了文件会发生什么?

因此,您需要编写以下代码:

class MySpider(CrawlSpider):
    name = 'pdf'
    start_urls = ['http://www.someurl.com']
    allowed_domains = ['someurl.com']

    def parse(self, response):
        for link in response.css('a'):
            yield response.follow(
                link,
                callback=self.parse_document,
                meta={'link_text': link.xpath('text()').get()}
            )


    def parse_document(self, response):
        # …
        if content_type == "application/pdf":
            # …
            document = DocumunetPipeline()
            # …
            document['link_text'] = response.meta['link_text']
            yield document

此时,您从支票中什么也得不到。您仍然必须添加一个try catch。相反,这仅意味着您必须通过网络进行额外的调用,并使您的代码更加复杂。所以只要这样做:

if (sftp.FolderExists(sftpPath30s))
{
   var files30s = sftp.ListDirectory(sftpPath30s);
   if(files30s!=null)
   {
       ...
   }
}