Car*_*Bos 19
该库有一些怪癖,使这个递归上市棘手,因为之间的相互作用ChangeDirectory
和ListDirectory
不工作,你可能期望.
以下内容未列出/ 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
,因为它使用的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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
尝试这个:
var filePaths = client.ListDirectory(client.WorkingDirectory);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
34348 次 |
最近记录: |