Renci SSH.NET:如何删除非空目录?

Eri*_*rik 3 .net c# recursion sftp ssh.net

我正在使用Renci SSH.NET来访问UNIX服务器上的文件和文件夹。我想通过指定基本目录来删除整个目录树,但是当我调用时sftp.DeleteDirectory(destination),只有在传递空目录时该调用才会成功。

但是,我也希望能够删除包含文件或其他文件夹的目录。大多数.NET类将自动处理该问题,如何在SSH.NET中完成?

Mar*_*ryl 6

SSH.NET库不支持任何递归操作。因此,递归删除也不可用。

您必须使用该SftpClient.ListDirectory方法来递归列出所有文件和子文件夹,并将它们一个一删除。

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);
}
Run Code Online (Sandbox Code Playgroud)

或使用另一个SFTP库。

例如,对于WinSCP .NET程序集,您可以使用可以递归删除目录的Session.RemoveFiles方法

// 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();
}
Run Code Online (Sandbox Code Playgroud)

WinSCP GUI可以为您生成代码模板

(我是WinSCP的作者)