Quantcast
Channel: Rebex Q&A Forum - Recent questions and answers
Viewing all articles
Browse latest Browse all 3862

Answered: Server reports current directory as a relative path. Multi-file operations cannot be used with this server.

$
0
0

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);
    }
}

Viewing all articles
Browse latest Browse all 3862

Trending Articles