Autor Téma: TIdFTP Size problém  (Přečteno 346 krát)

Offline Ján Masaryk

  • Nováček
  • *
  • Příspěvků: 27
  • Karma: 1
    • Verze Delphi: 2010
TIdFTP Size problém
« kdy: 23-03-2017, 21:02:26 »
Zdravím Delphistov.

Mám D2010 a Indy10.

Po dlhšej dobe riešim niečo s ftp a narazil som na jeden problém.

TIDFtp.Size() mi vracia hodnotu -1.

Skúšal som už všetky možné tipy z Googlu vrátane TransferType ftBinary a UseMLIS  false - čo nastavuje ako som zistil pri debugovaní aj INDY...

Jediný spôsob, ako sa viem k veľkosti súboru dostať je cez IdFTP1.DirectoryListing.Items.Size,
ale to je dosť neefektívny spôsob, nakoľko musím prejsť celý adresár...

Pokúšal som sa pre priamy selekt konkrétneho súboru tak, že som miesto premennej  i v IdFTP1.DirectoryListing.Items.Size použiť IdFTP1.DirectoryListing.IndexOf() ale tam som skončil s hlásením 'incompatible types TIdFTPLIstItems and string' - teda neviem, akú hodnotu tam mám dať...

Zaujímavé je, že v roku 2009 som robil  FTP manager na hromadné kopírovanie súborov na server a tam mi overovanie veľkosti fungovalo normálne....

Moje riešenie funguje, ale veľmi sa mi to nepáči a určite sa nepáči ani vám...

Riešili ste už takýto problém, resp máte nejaké zmysluplné riešenie ?

Vopred ďakujem za info.


Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1080
  • Karma: 36
    • Verze Delphi: 7, 2010
Re:TIdFTP Size problém
« Odpověď #1 kdy: 24-03-2017, 12:59:35 »
http://www.indyproject.org/kb/index.html?howdoiobtainthesizeofa.htm

Offline Ján Masaryk

  • Nováček
  • *
  • Příspěvků: 27
  • Karma: 1
    • Verze Delphi: 2010
Re:TIdFTP Size problém
« Odpověď #2 kdy: 26-03-2017, 20:37:00 »
Ďakujem za odpoveď. To som pozeral. Ja sem píšem iba keď som skutočne v koncoch.
Prepáč, že neskoro odpovedám, čakal som na odpoveď z hostingu.

Dnes som sa k tomu vrátil, pozrel som si zdrojáky staršieho programu, ktorý funguje a zistil som nasledovné:

Funkcia IdFTP1.Size() funguje, pokiaľ sa nezavolá IdFTP1.List() - potom funkcia IdFTP1.Size() vracia -1.
Veľkosť súboru sa dá potom zistiť iba cez IdFTP1.DirectoryListing.Items.Size.
... alebo znova urobiť Disconnect a Connect.
... a samozrejme TransferType nastavené na ftBinary - čo som mal nastavené.

Možno to niekomu pomôže...
 
« Poslední změna: 26-03-2017, 20:39:40 od Ján Masaryk »

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1265
  • Karma: 28
    • Pepak.net
Re:TIdFTP Size problém
« Odpověď #3 kdy: 27-03-2017, 08:20:17 »
Není náhodou problém u konkrétního FTP serveru? Problémy s FTP, které se týkají velikosti souborů, jsou dva:

1) Velikost se běžně zjišťuje příkazem SIZE, který ovšem server nemusí podporovat.

2) Čtení adresáře má omezení v tom, že není stanovený formát výpisu. Každý FTP server může mít výpis jiný a pokud se v tom FTP klient má vyznat, musí ten který konkrétní formát znát.

Tvůj problém by docela dobře mohl spočívat v tom, že tvůj FTP klient je "inteligentní", takže používá SIZE jen v případě, že musí - že ještě neproběhl LIST. A podle projevů to skoro vypadá, jako kdyby si příznak "proběhl LIST" nastavil i v případě, že se výsledek LISTu nepodařilo zparsovat (to je samozřejmě chyba). Zkusil bych krokovat tímhle směrem.
« Poslední změna: 27-03-2017, 08:22:07 od pepak »

Offline Ján Masaryk

  • Nováček
  • *
  • Příspěvků: 27
  • Karma: 1
    • Verze Delphi: 2010
Re:TIdFTP Size problém
« Odpověď #4 kdy: 27-03-2017, 14:35:40 »
Problém nie je na strane hostingu.

A áno, je to o inteligencii komponent Indy.

Chybu som urobil ja, lebo som to skúšal na starom testovacom programe a omylom som pred Size zavolal List.

Ak zavolám

Kód: Delphi [Vybrat]
  1.    IdFTP1.TransferType := ftBinary;
  2.    IdFTP1.Username := 'username';
  3.    IdFTP1.Password := 'password';
  4.    IdFTP1.Host := 'nejakeftp';
  5.    idFtp1.Connect;
  6.    IdFTP1.ChangeDir('/www_root');
  7.    nSIZE := IdFTP1.Size('subor.csv');
  8.  

Ak súbor existuje - vráti to veľkosť súboru
Ak súbor neexistuje - vráti -1 - teda dá sa to použiť na overenie existencie súboru.

V prípade, že zavolám List

Kód: Delphi [Vybrat]
  1.    IdFTP1.TransferType := ftBinary;
  2.    IdFTP1.Username := 'username';
  3.    IdFTP1.Password := 'password';
  4.    IdFTP1.Host := 'nejakeftp';
  5.    idFtp1.Connect;
  6.    IdFTP1.ChangeDir('/www_root');
  7.  
  8.    List := TStringList.Create;
  9.    IdFTP1.DirectoryListing.Create;
  10.  
  11.    IdFTP1.List(List,'*.*', true);
  12.  
  13.    nSIZE := IdFTP1.Size('subor.csv');
  14.  
  15.  

nSize je -1 a teda prestane

potom sa k veľkosti súboru dostanem napríklad

Kód: Delphi [Vybrat]
  1.       IdFTP1.List(List, 'subor.csv', true);
  2.       if IdFTP1.DirectoryListing.Count = 1 then
  3.       begin
  4.          nSIZE := IdFTP1.DirectoryListing.Items[0].Size;
  5.       end;
  6.  
  7.  

nSize je správna veľkosť súboru

Posledný kód bol iba náhradou za to, že mi nefungovalo Size, lebo som predtým zavolal List

Teda vlastne žiaden problém, ako som napísal na začiatku tohoto príspevku  :)
Chyba bola medzi stoličkou a klávesnicou  ;)
« Poslední změna: 27-03-2017, 14:42:44 od Ján Masaryk »

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Jméno: E-mail:
Ověření:
Kolik je šest plus čtyři (slovem):