Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Renci SSH.NET: How to delete nonempty directory?

I am using Renci SSH.NET to access files and folders on a unix server. I would like to delete a whole directory tree by specifying the base directory, but when I call sftp.DeleteDirectory(destination), that call will only succeed if I pass an empty directory.

However, I would also like to be able to delete directories containing files or additional folders. Most .NET classes will handle that automatically, how can it be done in SSH.NET?

like image 848
Erik Avatar asked Apr 12 '16 08:04

Erik


People also ask

How do I empty a directory in C#?

The simplest way: Directory. Delete(path,true); Directory. CreateDirectory(path);

How do I delete a file from SFTP server?

To delete a file on the server, type "rm" and then the filename. Syntax: psftp> rm filename.


2 Answers

The SSH.NET library does not support any recursive operations. So recursive delete is not available either.

You have to use the SftpClient.ListDirectory method to recursively list all files and subfolders and delete them one by one.

private static void DeleteDirectory(SftpClient client, string path)
{
    foreach (SftpFile file in client.ListDirectory(path))
    {
        if ((file.Name != ".") && (file.Name != ".."))
        {
            if (file.IsDirectory)
            {
                DeleteDirectory(client, file.FullName);
            }
            else
            {
                client.DeleteFile(file.FullName);
            }
        }
    }

    client.DeleteDirectory(path);
}

Or use another SFTP library.

For example with WinSCP .NET assembly, you can use the Session.RemoveFiles method that can delete a directory recursively.

// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
    Protocol = Protocol.Sftp,
    HostName = "example.com",
    UserName = "user",
    Password = "mypassword",
    SshHostKeyFingerprint = "ssh-rsa 2048 xxxxxxxxxxx...="
};

using (Session session = new Session())
{
    // Connect
    session.Open(sessionOptions);

    // Delete the directory recursively
    session.RemoveFiles("/directory/to/delete").Check();
}

WinSCP GUI can generate a code template for you.

(I'm the author of WinSCP)

like image 84
Martin Prikryl Avatar answered Oct 02 '22 02:10

Martin Prikryl


Try executing the command in SSH instead of using sftp rm -rf or rm -r.

Code may look something like this:

Renci.SshClient ssh1 = new SshCLient("server","user","password");
ssh1.connect();
ssh1.RunCommand("cd LandingZone;rm -rf <directoryName>");
ssh1.Disconnect();
like image 38
Shankar Anumula Avatar answered Oct 02 '22 03:10

Shankar Anumula