c# - SSH.NET SFTP 递归获取目录和文件列表

标签 c# .net sftp ssh.net

我正在使用 Renci.SshNet 库通过 SFTP 递归地获取文件和目录列表。我可以连接 SFTP 站点,但我不确定如何在 C# 中递归获取目录和文件列表。我还没有找到任何有用的例子。

有人试过吗?如果是这样,您能否发布一些有关如何递归获取这些文件和文件夹的示例代码。

谢谢,
真理

最佳答案

这个库有一些怪癖使这个递归列表变得棘手,因为 ChangeDirectoryListDirectory 之间的交互并不像您预期​​的那样工作。

以下内容列出/home 目录中的文件,而是列出/(根)目录中的文件:

sftp.ChangeDirectory("home");
sftp.ListDirectory("").Select (s => s.FullName);

以下不工作并返回 SftpPathNotFoundException:

sftp.ChangeDirectory("home");
sftp.ListDirectory("home").Select (s => s.FullName);

下面是列出/home目录下文件的正确方法

sftp.ChangeDirectory("/");
sftp.ListDirectory("home").Select (s => s.FullName);

如果你问我,这太疯狂了。使用 ChangeDirectory 方法设置默认目录对 ListDirectory 方法没有影响,除非您在此方法的参数中指定文件夹。似乎应该为此编写一个错误。

因此,当您编写递归函数时,您必须设置一次默认目录,然后在遍历文件夹时更改 ListDirectory 调用中的目录。该列表返回可枚举的 SftpFiles。然后可以针对 IsDirectory == true 单独检查这些。请注意,该列表还返回 ... 条目(它们是目录)。如果你想避免无限循环,你会想跳过这些。 :-)

编辑 2/23/2018

我正在审查我的一些旧答案,并想为上面的答案道歉并提供以下工作代码。请注意,此示例不需要 ChangeDirectory,因为它使用 Fullname 作为 ListDirectory:

void Main()
{
    using (var client = new Renci.SshNet.SftpClient("sftp.host.com", "user", "password"))
    {
        var files = new List<String>();
        client.Connect();
        ListDirectory(client, ".", ref files);
        client.Disconnect();
        files.Dump();
    }
}

void ListDirectory(SftpClient client, String dirName, ref List<String> files)
{
    foreach (var entry in client.ListDirectory(dirName))
    {

        if (entry.IsDirectory)
        {
            ListDirectory(client, entry.FullName, ref files);
        }
        else
        {
            files.Add(entry.FullName);
        }
    }
}

关于c# - SSH.NET SFTP 递归获取目录和文件列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13572889/

相关文章:

java - ls 过滤 channel ftp

c# - 按日期排序文件

macos - 如何 SFTP 到 Amazon EC2 Ubuntu t1.micro 实例?

c# - 简单的 WPF 数据绑定(bind)导致 StackOverFlow 异常

.net - 在 Lucene 中获取文档 ID

c# - IDisposable.Dispose() 是否自动调用?

c# - 以编程方式使用选中的选项填充 CheckBoxList

OSX 10.8 的 SSHFS(山狮)

c# - 在 C# 中使用 Newtonsoft.JSON 努力反序列化 JSON 字符串

c# - 如何从已知方法中获取方法名?