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

use*_*119 11 .net c# sftp ssh.net

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

有人试过吗?如果是这样,你可以发布一些关于如何递归获取这些文件和文件夹的示例代码.

谢谢,
普拉夫

Car*_*Bos 19

该库有一些怪癖,使这个递归上市棘手,因为之间的相互作用ChangeDirectoryListDirectory不工作,你可能期望.

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

sftp.ChangeDirectory("home");
sftp.ListDirectory("").Select (s => s.FullName);
Run Code Online (Sandbox Code Playgroud)

以下就不能正常工作,并返回一个SftpPathNotFoundException:

sftp.ChangeDirectory("home");
sftp.ListDirectory("home").Select (s => s.FullName);
Run Code Online (Sandbox Code Playgroud)

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

sftp.ChangeDirectory("/");
sftp.ListDirectory("home").Select (s => s.FullName);
Run Code Online (Sandbox Code Playgroud)

如果你问我,这真是太疯狂了.除非在此方法的参数中指定文件夹,否则使用该ChangeDirectory方法设置默认目录不会影响ListDirectory该方法.好像应该为此编写一个bug.

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

编辑2/23/2018

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

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • sftp.ListDirectory("")不起作用,但sftp.ListDirectory(".")确实 - 记住,'.' 意思是'当前目录'.但是,它似乎不支持主文件夹的"〜"快捷方式. (6认同)

小智 5

尝试这个:

var filePaths = client.ListDirectory(client.WorkingDirectory);
Run Code Online (Sandbox Code Playgroud)