If recursive Ftp.GetItemsAsync()
cannot be used, you can write your own traversal logic like this:
public static async Task<IEnumerable<FtpItem>> GetItemsAsync(Ftp client, string parentPath)
{
var result = new List<FtpItem>();
var list = await client.GetListAsync();
foreach (var item in list)
{
// determine correct path
string path = parentPath.TrimEnd('/') + "/" + item.Name;
result.Add(new FtpItem(path, item.Name, item.Length, item.Type));
if (item.IsDirectory)
{
// recursively traverse directories
client.ChangeDirectory(item.Name);
result.AddRange(await GetItemsAsync(client, path));
client.ChangeDirectory("..");
}
}
return result;
}
The code can be used like this:
using (var client = new Ftp())
{
client.Connect("test.rebex.net", SslMode.Implicit);
client.Login("demo", "password");
// specify desired directory or "." for current dir
string directoryToList = ".";
// navigate to desired directory or resolve "."
if (directoryToList == ".")
directoryToList = client.GetCurrentDirectory();
else
client.ChangeDirectory(directoryToList);
// get items recursively and print output
var list = await GetItemsAsync(client, directoryToList);
foreach (var item in list)
{
Console.WriteLine(item.Path);
}
}