Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
TIdFtp Toplam Kullanılan Alan Hesaplama Hakkında Yardım
#1
TIdFtp nesnesi ile FTP sunucusu ile bağlantı kurup indirme, yükleme vb. işlemleri yapabiliyorum yalnız kullanılan disk alanı hesaplamasını bir türlü yapamadım. Örneğin 10GB disk kapasitesi 2GB kullanılan 8GB boş alan gibi bilgi yazdırmak istiyorum ekrana. İnternette araştırdım ama bir sonuca varamadım. Konu hakkında bilgisi olan yardımcı olabilir mi?
Cevapla
#2
Merhaba.

FTP müsait alan sorgulama imkanının FTP host türüne göre değişen bir özellik olduğunu biliyorum.

Örneğin kendi hostlarımdan birinden erişim bilgisi paylaşayım.
WinSCP ile ( bir FTP client yazılımıdır )   bakıldığında aşağıdaki resimde göreceğiniz özelliklere izin vermektedir.


ioo9anawrf1acpfev6ma.png

Çözüm olarak tahmin edebileceğiniz üzere; recursive olarak tüm FTP dolaşıp, dosya uzunluklarını toplamak ardından da size sunulan FTP host uzunluğu ile arasındaki farkı matematiksel olarak bulmak.

Bu da tahmin edebileceğiniz şekilde oldukça yavaş bir işlem olacaktır.

* Diğer yandan eğer ilgilendiğiniz host veya hostlar size aitse, forumda paylaşılan HTML  Login / Parse işlemleri ile çabucak ve direkt sonuca ulaşmanız mümkün.  
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#3
(07-11-2021, Saat: 11:21)mrmarman Adlı Kullanıcıdan Alıntı: Merhaba.

FTP müsait alan sorgulama imkanının FTP host türüne göre değişen bir özellik olduğunu biliyorum.

Örneğin kendi hostlarımdan birinden erişim bilgisi paylaşayım.
WinSCP ile ( bir FTP client yazılımıdır )   bakıldığında aşağıdaki resimde göreceğiniz özelliklere izin vermektedir.


ioo9anawrf1acpfev6ma.png

Çözüm olarak tahmin edebileceğiniz üzere; recursive olarak tüm FTP dolaşıp, dosya uzunluklarını toplamak ardından da size sunulan FTP host uzunluğu ile arasındaki farkı matematiksel olarak bulmak.

Bu da tahmin edebileceğiniz şekilde oldukça yavaş bir işlem olacaktır.

* Diğer yandan eğer ilgilendiğiniz host veya hostlar size aitse, forumda paylaşılan HTML  Login / Parse işlemleri ile çabucak ve direkt sonuca ulaşmanız mümkün.  

Recursive olarak tüm FTP dolaşıp, dosya uzunluklarını toplama işlemi yaptırarak istediklerimi elde edebiliyorum yalnız 40 dosya 8 sn yede hesaplama yapıyor. Bu işlem dosyalar artıkça işlem uzayacak gibi. idFTP nesnesinde size methodu ile sadece dosyaların boyutunu öğrenebiliyorum klasörlerin boyutunu öğrenenbilmem için bir method yada fonksiyon varmıdır?
Cevapla
#4
Bir önceki mesajımda

* Diğer yandan eğer ilgilendiğiniz host veya hostlar size aitse, forumda paylaşılan HTML  Login / Parse işlemleri ile çabucak ve direkt sonuca ulaşmanız mümkün.  

demiştim.

Detaylandıralım :
1. Host size mi ait ?
2. WEB Browser ile bu host kontrol paneline erişebiliyor musunuz ?
3. host kontrol panelinde FTP boyutu ve kalanını görebiliyor musunuz ?

bu üç sorunun cevabı olumlu ise, Delphi içerisinden bu işlemi simüle ederek, HTML PARSE  işlemi ile kalan depolama alanını öğrenebilirsiniz.  


m1n7ewloolu3axosar3h.png
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#5
(07-11-2021, Saat: 12:52)mrmarman Adlı Kullanıcıdan Alıntı: Bir önceki mesajımda

* Diğer yandan eğer ilgilendiğiniz host veya hostlar size aitse, forumda paylaşılan HTML  Login / Parse işlemleri ile çabucak ve direkt sonuca ulaşmanız mümkün.  

demiştim.

Detaylandıralım :
1. Host size mi ait ?
2. WEB Browser ile bu host kontrol paneline erişebiliyor musunuz ?
3. host kontrol panelinde FTP boyutu ve kalanını görebiliyor musunuz ?

bu üç sorunun cevabı olumlu ise, Delphi içerisinden bu işlemi simüle ederek, HTML PARSE  işlemi ile kalan depolama alanını öğrenebilirsiniz.  
Host Bana ait değil ama ben bu işlemleri eklenen ve silinen dosyaların boyutlarını hesaplatarak veritabanına kaydediyorum. Sonra hesaplamaları yapıyorum işlem yükünde kurtuldum şuan. Ama şimdi yeni bir sıkıntı çıktı karşıma RemoveDir fonksiyonu sadece klasör içeriği boş ise siliyor klasör dolu ise silmiyor. Önce klasörün içini silip sonra klasörü silmemi istiyor sorun şurada klasörün içerisinde alt klasörler hatta o alt klasörlerinin içinde alt klasörler olabilir bu işlemi nasıl yapacağımı çözemedim.
Cevapla
#6
Host size ait olmadığı için mecburen recursive çözüm üreteceğiz... 
Aşağıdaki örnekte bir defa IdFTP nesnesi create ediliyor. Hayat döngüsü içerisinde klasör ve dosyalar içten dışa gezilerek siliniyorlar, sonunda nesne free ediliyor.

Örnek :
Uses IdFtp;

procedure FTPDirectoryRemove( aHost, aRemotePath, aUsername, aPassword: String );
  procedure RecursiveFileDelete( aFTP: TIdFtp; aFolderName: String );
  var
    i     : Integer;
    LList : TStringList;
  begin
    LList := TStringList.Create;
    try
      aFTP.ChangeDir(aFolderName);

      aFTP.List(LList, '', false);
      while LList.IndexOf('.')  > -1  do LList.Delete( LList.IndexOf('.') );
      while LList.IndexOf('..') > -1  do LList.Delete( LList.IndexOf('..') );
      for i := 0 to LList.Count - 1 do
      begin
        if aFTP.Size( LList[i] ) = -1
          then RecursiveFileDelete( aFTP, LList[i] )
          else aFTP.Delete( LList[i] );
      end;
      aFTP.ChangeDirUp;
      aFTP.RemoveDir( aFolderName );
    finally
      LList.Free;
    end;
  end;
var
  LIdFTP  : TIdFtp;
begin
  LIdFTP := TIdFtp.Create(nil);
  With LIdFTP do
  try
    Host      := aHost;
    Username  := aUsername;
    Password  := aPassword;
    Connect();
   if Connected then
   begin
     RecursiveFileDelete( LIdFTP, aRemotePath );
     Disconnect;
   end;
  finally
    LIdFtp.Free;
  end;
end;


Kullanımı :

procedure TForm1.Button1Click(Sender: TObject);
begin
  FTPDirectoryRemove( '45.158.12.xxx', '/armanpro.com/css2/', 'loginname', 'password' );
end;
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#7
(07-11-2021, Saat: 15:43)mrmarman Adlı Kullanıcıdan Alıntı: Host size ait olmadığı için mecburen recursive çözüm üreteceğiz... 
Aşağıdaki örnekte bir defa IdFTP nesnesi create ediliyor. Hayat döngüsü içerisinde klasör ve dosyalar içten dışa gezilerek siliniyorlar, sonunda nesne free ediliyor.

Örnek :

procedure FTPDirectoryRemove( aHost, aRemotePath, aUsername, aPassword: String );
  procedure RecursiveFileDelete( aFTP: TIdFtp; aFolderName: String );
  var
    i     : Integer;
    LList : TStringList;
  begin
    LList := TStringList.Create;
    try
      aFTP.ChangeDir(aFolderName);

      aFTP.List(LList, '', false);
      while LList.IndexOf('.')  > -1  do LList.Delete( LList.IndexOf('.') );
      while LList.IndexOf('..') > -1  do LList.Delete( LList.IndexOf('..') );
      for i := 0 to LList.Count - 1 do
      begin
        if aFTP.Size( LList[i] ) = -1
          then RecursiveFileDelete( aFTP, LList[i] )
          else aFTP.Delete( LList[i] );
      end;
      aFTP.ChangeDirUp;
      aFTP.RemoveDir( aFolderName );
    finally
      LList.Free;
    end;
  end;
var
  LIdFTP  : TIdFtp;
begin
  LIdFTP := TIdFtp.Create(nil);
  With LIdFTP do
  try
    Host      := aHost;
    Username  := aUsername;
    Password  := aPassword;
    Connect();
    if Connected then
      RecursiveFileDelete( LIdFTP, aRemotePath );
  finally
    LIdFtp.Free;
  end;
end;


Kullanımı :

procedure TForm1.Button1Click(Sender: TObject);
begin
  FTPDirectoryRemove( '45.158.12.xxx', '/armanpro.com/css2/', 'loginname', 'password' );
end;
bende aşağıdaki gibi bir işlem ile sildiriyorum. Yalnız ftp ana dizinde içiçe en fazla 3 klasör olacak şekilde izin veriyorum. Bu sefer dosyaların silinmesi daha hızlı oluyor gibi.

procedure TFBulutYedekleme.DosyaSil(DosyaAdi:string);
var
 DosyaYolu,AktifDizin:string;
 Dosya1,Dosya2,Dosya3:TStrings;
 i1,i2,i3: Integer;
 vItem: TListItem;
 vStrList: TStringList;
begin
  if IdFTP1.RetrieveCurrentDir='/' then
    begin
      DosyaYolu :='/'+DosyaAdi;
      AktifDizin:='/';
    end
  else
    begin
      DosyaYolu :=IdFTP1.RetrieveCurrentDir+'/'+DosyaYolu;
      AktifDizin:=IdFTP1.RetrieveCurrentDir;
    end;

  Dosya1:=TStringList.Create;
  Dosya2:=TStringList.Create;
  Dosya3:=TStringList.Create;

  IdFTP1.ChangeDir(DosyaYolu);  ShowMessage(DosyaYolu);
  IdFTP1.List(dosya1,'',false);
  for i1 := 0 to Dosya1.Count -1 do
    begin
      if IconBul(Dosya1[i1])<>4 then    IdFTP1.Delete(Dosya1[i1])
      else
        begin
          IdFTP1.ChangeDir(DosyaYolu+'/'+Dosya1[i1]);
          IdFTP1.List(Dosya2,'',false);
          for i2 := 0 to Dosya2.Count -1 do
            begin
              if IconBul(Dosya2[i2])<>4 then    IdFTP1.Delete(Dosya2[i2])
              else
                begin
                  IdFTP1.ChangeDir(DosyaYolu+'/'+Dosya1[i1]+'/'+Dosya2[i2]);
                  IdFTP1.List(Dosya3,'',false);
                  for i3 := 0 to Dosya3.Count -1 do
                    begin
                      IdFTP1.Delete(Dosya3[i3]);
                    end;
                  IdFTP1.ChangeDir(DosyaYolu+'/'+Dosya1[i1]);
                  IdFTP1.RemoveDir(Dosya2[i2]);
                end;
            end;
          IdFTP1.ChangeDir(DosyaYolu);
          IdFTP1.RemoveDir(Dosya1[i1]);
        end;
    end;
   IdFTP1.ChangeDir(AktifDizin);
   IdFTP1.RemoveDir(DosyaAdi);
   Dosya1.Free;
   Dosya2.Free;
   Dosya3.Free;
end;
Cevapla
#8
Her "ChangeDir" ile yeni bir "List" alındığı göz önüne alındığında üç klasör ile sınırlamak konusunda haklısınız.
Aksi halde klasör sayısı artıkça ağ trafiği artar, çünkü internet ortamı görece yavaş bir ortamdır.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  yardim HEX file deutsch1988 1 413 07-03-2024, Saat: 06:45
Son Yorum: emozgun
  acil yardim deutsch1988 2 151 07-03-2024, Saat: 00:06
Son Yorum: deutsch1988
  yardim lazim Modulo 256 deutsch1988 16 664 05-03-2024, Saat: 14:42
Son Yorum: deutsch1988
  AES Şifreleme Hakkında tmrksmt 18 1.281 14-02-2024, Saat: 10:42
Son Yorum: tmrksmt
  TDictionary kullanımım hakkında yhackup 3 399 09-02-2024, Saat: 15:58
Son Yorum: SimaWB



Konuyu Okuyanlar: 1 Ziyaretçi