首页 > 解决方案 > 使用 SSH.NET 计算符合特定条件的 SFTP 文件

问题描述

我有一个工作程序,可以从远程服务器中删除日志文件(基于某种模式)。现在,当我想获得符合我的标准的文件数时,我遇到了问题。原来我无法直接从SftpFile文件对象中获取计数。我只能在设置断点后获取文件的数量。

我可以使用以下方法删除文件:

private void ListDirectory(SftpClient client, String dirName)
{
    var fileext = ".log";
    var fileextension = fileext.ToString();

    foreach (SftpFile file in client.ListDirectory(dirName))
    {
        var logFilePath = file.FullName;
        var fileCount = client.ListDirectory(dirName).GetEnumerator();

        if ((file.Name != ".") && (file.Name != "..") && file.Name.EndsWith(fileextension))
        {
            Console.WriteLine(file.FullName);
            client.Delete(logFilePath);
            Console.ReadKey();
        }
    }
}

当我设置断点时,我可以从这一行的嵌套对象中获取计数:

var fileCount = client.ListDirectory(dirName).GetEnumerator();

我有调试的快照:

在此处输入图像描述

现在我需要一种方法来直接访问我的模式的文件数,即这一行:

if ((file.Name != ".") && (file.Name != "..") && file.Name.EndsWith(fileextension))

当我尝试如下应用一些 Linq 时:

 var fileCount = client.ListDirectory(dirName).Where((file.Name != ".") && (file.Name != "..") && file.Name.EndsWith(fileextension)).Count();

我得到进一步的例外说

无法从“布尔”转换为“system.func”

标签: c#.netsftpssh.net

解决方案


您在Where方法参数中的语法不是有效的 lambda 函数,您错过了参数列表。它应该是:

.Where(file => (file.Name != ".") && (file.Name != "..") && file.Name.EndsWith(fileextension))

另外,不要ListDirectory重复调用,只在每次迭代中调用。

var files = client.ListDirectory(dirName);
files = files.Where(file => (file.Name != ".") && (file.Name != "..") && file.Name.EndsWith(fileextension));
int count = files.Count();
foreach (SftpFile file in files)
{
    // ...
}

推荐阅读