我正在使用 Renci.SshNet 库通过 SFTP 递归地获取文件和目录列表。我可以连接 SFTP 站点,但我不确定如何在 C# 中递归获取目录和文件列表。我还没有找到任何有用的例子。
有人试过吗?如果是这样,您能否发布一些有关如何递归获取这些文件和文件夹的示例代码。
谢谢,
真理
最佳答案
这个库有一些怪癖使这个递归列表变得棘手,因为 ChangeDirectory
和 ListDirectory
之间的交互并不像您预期的那样工作。
以下内容不列出/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/