Merhaba, bu yazıda size “C# ile SFTP Erişimi ve Dosya Silme” hakkında bilgi vereceğim. Bir önceki yazıda Calendar API‘ yi anlatmıştım.
SFTP Nedir ?
Secure FTP (Güvenli Dosya Taşıma Protokolü), SSH kullanarak dosya transferi yapan aktarım protokolüdür. FTP’den farkı SSH kullanmasıdır.
SFTP Bizim İşimize Nerede Yarar ?
SFTP üzerinde günlük yedekleme yaptığınız düşünelim ve bu sistemi her gün kontrol etmek yerine yapacağınız bir servis ile otomatik olarak dosyalarınızı sildirebilirsiniz. Bende size bugün o konu hakkında bilgi vereceğim. Siz başka işlemler için kullanabilirsiniz.
İlk önce vereceğim linkten DLL indirip projenize eklemeniz gerekmektedir. DLL projenize eklemek için Solution Explorer -> References Sağ Tık -> Add Reference -> Browse seçeneğinden indirmiş olduğunuz dosyayı projenize ekleyeceksiniz.
Aşağıda verdiğim kodları Using NameSpacesine ekliyorsunuz.
1 2 3 4 | using System.Collections; using Tamir.SharpSsh; using System.Reflection; using Tamir.SharpSsh.jsch; |
Ben burada _DosyaAdi adında değişken oluşturuyorum. Ben burada bulunduğum günden bir gün öncesinin yedeğini silmek istiyorum. Daha sonra SFTP Classından sftp adında nesne oluşturuyorum. Bu Class üç tane parametre alıyor. SFTP Host,Kullanıcı Adı, Şifre parametrelerini alıyor.
C# ile SFTP Erişimi ve Dosya Silme
1 2 | string _DosyaAdi = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd"); Sftp sftp = new Sftp("sftphost", "kullaniciadi", "şifre"); |
SFTP’ye bağlantımızı sağlıyoruz.
1 | sftp.Connect(); |
Daha sonra bir ArrayList’ e dosya yolundaki dosyaları ekliyoruz. Yani dosya adlarını listeleme yapıyoruz.
1 | ArrayList files = sftp.GetFileList("/backup/" + _DosyaAdi); |
Aşağıda bir foreach kuruyoruz liste kadar daha sonra . ve .. dosyalarını almak istemiyoruz. Daha sonra bir foreach daha kuruyoruz ulaştığımız dosyanında için silmek istiyoruz. Bundaki amaç dosyaların içi silinmeden bir üst klasör silinmiyor. rm komutu dile dosyaları siliyoruz. rmdir komutu ile de klasörü siliyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | foreach (string satir in files) { if (satir != ".") { if (satir != "..") { ArrayList files1 = sftp.GetFileList("/backup/" + _DosyaAdi + "/" + satir); foreach (string satir1 in files1) { if (satir1 != ".") { if (satir1 != "..") { var prop = sftp.GetType().GetProperty("SftpChannel", BindingFlags.NonPublic | BindingFlags.Instance); var methodInfo = prop.GetGetMethod(true); var sftpChannel = methodInfo.Invoke(sftp, null); ((ChannelSftp)sftpChannel).rm("/backup/" + _DosyaAdi + "/" + satir + "/" + satir1); } } } var a = sftp.GetType().GetProperty("SftpChannel", BindingFlags.NonPublic | BindingFlags.Instance); var b = a.GetGetMethod(true); var c = b.Invoke(sftp, null); ((ChannelSftp)c).rmdir("/backup/" + _DosyaAdi + "/" + satir); } } } |
Silmek istediğimiz klasörün içini sildiğimize göre artık kendisini silmeye geldik.
1 2 3 4 | var m = sftp.GetType().GetProperty("SftpChannel", BindingFlags.NonPublic | BindingFlags.Instance); var l = m.GetGetMethod(true); var k = l.Invoke(sftp, null); ((ChannelSftp)k).rmdir("/backup/" + _DosyaAdi); |
İşlemimiz bitince SFTP bağlantısını sonlandırıyoruz.
1 | sftp.Close(); |
Soru ve görüşleriniz için [email protected] adresine mail atabilirsiniz.