Bu kütüphane bu özyinelemeli listeleme zor kılan bazı tuhaflıklar vardır.
şu değil listesine/home dizinindeki dosyaları yapar bunun yerine/(root) dosyaları listeler dizini:
sftp.ChangeDirectory("home");
sftp.ListDirectory("").Select (s => s.FullName);
gelmez aşağıdaki değil eser ve SftpPathNotFoundException döndürür:
sftp.ChangeDirectory("home");
sftp.ListDirectory("home").Select (s => s.FullName);
aşağıdaki/home dizinindeki dosyaları listelemek için doğru yoldur
sftp.ChangeDirectory("/");
sftp.ListDirectory("home").Select (s => s.FullName);
Bana sorarsan bu çok çılgın. Varsayılan yöntemin ChangeDirectory
yöntemiyle ayarlanması, bu yöntemin parametresinde bir klasör belirtmedikçe, ListDirectory
yönteminde bir etki yaratmaz. Bunun için bir böcek yazılmalı gibi görünüyor.
Bu nedenle, özyinelemeli işlevinizi yazdığınızda, varsayılan dizini bir kez ayarlamanız ve daha sonra klasörler üzerinde yinelediğinizde ListDirectory
aralığındaki dizini değiştirmeniz gerekir. Giriş, SftpFiles sayılamaz bir sayı döndürür. Bunlar daha sonra IsDirectory == true
için ayrı ayrı kontrol edilebilir. Sadece girişin de .
ve ..
girişlerini (dizinler) döndürdüğünü unutmayın. Sonsuz bir döngüden kaçınmak istiyorsanız bunları atlamak isteyeceksiniz. :-)
DÜZENLEME 2/23/2018
benim eski bazı yanıtlar incelerken ve üzeri cevap için özür ve aşağıdaki çalışma kodu arz etmek istiyorum. o ListDirectory
için Fullname
kullanıyor çünkü bu örnek, ChangeDirectory
gerektirmez unutmayın:
void Main()
{
using (var client = new Renci.SshNet.SftpClient("sftp.host.com", "user", "password"))
{
var files = new List<String>();
client.Connect();
ListDirectory(client, ".", ref files);
client.Disconnect();
files.Dump();
}
}
void ListDirectory(SftpClient client, String dirName, ref List<String> files)
{
foreach (var entry in client.ListDirectory(dirName))
{
if (entry.IsDirectory)
{
ListDirectory(client, entry.FullName, ref files);
}
else
{
files.Add(entry.FullName);
}
}
}
sftp.ListDirectory ("") çalışmıyor, ancak sftp.ListDirectory (".") Hatırlıyor '.' 'geçerli dizin' anlamına gelir. Ancak, ev klasörü için '~' kısayolunu desteklemiyor gibi görünüyor. – Gargravarr
Açıklama için, verilen bir kök klasörden başlayarak tüm dizinlerin ve alt dizinlerin bir listesini veya bir ağacını gerçekte nasıl alacağınıza dair tam bir örnek var mı? Ssh.net'in neden ListDirectory yönteminin kendisinde bir bool yineleme sunmadığını merak ediyorum. Bu günlerde .net için daha iyi bir çözüm var mı? Yani Bu temel görevleri zaten uygulayan özgür olan daha iyi bir lib nedir? Ancak, çalışan bir örnek çok yardımcı olabilir, teşekkürler! – Erik