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

时间:2016-04-12 08:20:56

标签: c# recursion directory sftp ssh.net

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

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

3 个答案:

答案 0 :(得分:4)

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

或使用其他SFTP库。

例如使用WinSCP .NET assembly,您可以使用可以递归下载目录的Session.RemoveFiles method

// 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为你。

(我是WinSCP的作者)

答案 1 :(得分:1)

尝试在ssh中执行命令而不是使用sftp rm -rf 要么 rm -r

代码可能如下所示: Renci.SshClient ssh1 = new SshCLient("server","user","password"); ssh1.connect(); ssh1.RunCommand("cd LandingZone;rm -rf <directoryName>"); ssh1.Disconnect();

答案 2 :(得分:0)

通过使用以下两种方法指定远程路径,可以使用SSH.NET库动态删除目录树或文件(无论是否为空目录):

  public bool DeleteRemoteDirectoryRecursive(string RemoteDirectoryPath)
  {
        if (string.IsNullOrEmpty(RemoteDirectoryPath))
        {                
            return false;
        }

        var ConnectionInfo = new ConnectionInfo(this.sftpHost, this.sftpPort, this.sftpUser, new PasswordAuthenticationMethod(this.sftpUser, this.sftpPassword));
        using (var client = new SftpClient(ConnectionInfo))
        {                
            client.Connect();

            if (!client.Exists(RemoteDirectoryPath))
            {                   
                client.Disconnect();
                client.Dispose();
                return false;
            }

            foreach (var file in client.ListDirectory(RemoteDirectoryPath))
            {
                if (file.Name.Equals(".") || file.Name.Equals(".."))
                    continue;

                if (file.IsDirectory)
                {
                    client.Disconnect();
                    DeleteRemoteDirectoryRecursive(file.FullName);
                }
                else
                    client.DeleteFile(file.FullName);
            }

            client.DeleteDirectory(RemoteDirectoryPath);

        }

        return true;
    }

    public bool Remove(string RemotePath)
    {
        bool ReturnResult = false;

        try
        {
            if (string.IsNullOrEmpty(RemotePath))
            {
                return false;
            }

            var ConnectionInfo = new ConnectionInfo(this.sftpHost, this.sftpPort, this.sftpUser, new PasswordAuthenticationMethod(this.sftpUser, this.sftpPassword));
            using (var client = new SftpClient(ConnectionInfo))
            {
                client.Connect();

                if (!client.Exists(RemotePath))
                {
                    client.Disconnect();
                    client.Dispose();
                    return false;
                }

                try
                {
                    //  path is directory
                    client.ChangeDirectory(RemotePath);
                    try
                    {
                        DeleteRemoteDirectoryRecursive(RemotePath);
                        ReturnResult = true;
                    }
                    catch
                    {
                        ReturnResult = false;
                    }

                }
                // path is a file
                catch
                {
                    try
                    {
                        client.DeleteFile(RemotePath);
                        ReturnResult = true;
                    }
                    catch
                    {
                        ReturnResult = false;
                    }
                }
            }
        }
        catch (Exception ex)
        {                
            ReturnResult = false;
        }
        return ReturnResult;
    }