我使用Renci SSH.NET访问unix服务器上的文件和文件夹。我想通过指定基目录来删除整个目录树,但是当我调用sftp.DeleteDirectory(destination)
时,只有在我传递一个空目录时,该调用才会成功。
但是,我还希望能够删除包含文件或其他文件夹的目录。大多数.NET类都会自动处理,如何在SSH.NET中完成?
答案 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;
}