Newsgroup: it.comp.lang.delphi
Titolo: Verificare URL

In una colonna di una griglia ho l'elenco di file di un ftp e 
devo verificare che il file esista...
io ho provato cosi ma non funziona
procedure TFrmDoc.ToolButton3Click(Sender: TObject);
var i:integer;
begin
 QryDoc.First;
 i:=1;
 while not QryDoc.Eof do
  begin
   if FileExists(DBAdvStringGrid1.Cells[1,i])then
    DBAdvStringGrid1.Cells[2,i]:='OK'
   else DBAdvStringGrid1.Cells[2,i]:='Errore';
   i:=i+1;
   QryDoc.Next;
  end;
end;
Grazie Manuel
--- posted by geoForum on 
http://www.delphiedintorni.it

>    if FileExists(DBAdvStringGrid1.Cells[1,i])then
Ma, devi verificare se il file che sta sul server è presente in locale?
Bye,
Raktzo

    if FileExists(DBAdvStringGrid1.Cells[1,i])then
Questo mi sembra piuttosto ovvio.
Utilizza TIdFTP.
-- 
I am what I am, I do what I can
Vuoi supportarmi? 
http://url.repository.biz/go/3E
Do. Or do not. There is not try.

Ho risolto in parte... io ho un area ftp dove vengono salvati dei 
documenti e un programma dove vengono indicizzati e categorizzati.
La mia procedura deve fare 2 cose:
1- Verificare che i file indicizzati dal programma siano effettivamente 
   nell'area ftp.
2- Riportare file che sono nel FTP ma non sono ancora stati indicizzati
   dal programma.
La prima parte ora sembra ok la seconda mi sto disperando...
function FTPFileExists(AFTPClient : TIdFTP; const AFile : string) : 
Boolean;
begin
    Result := False;
    try
      if not AFTPClient.Connected then //Pas connecté ?
        AFTPClient.Connect(); //On connecte
    except
       Exit; //Impossible de connecter !
    end;
    Result:=AFTPClient.Size(AFile)<>-1;
end;
procedure TFrmDoc.ToolButton3Click(Sender: TObject);
var i:integer;
    Apps:Tstrings;
begin
 QryDoc.First;
 i:=1;
 IdFTP1.Host := '192.168.0.197';
 IdFTP1.Port:=10022;
 IdFTP1.Username := 'anonymous';
 if idFTP1.Connected then idFTP1.Disconnect;
 idFTP1.Connect();
 while not QryDoc.Eof do
  begin
   if FTPFileExists(idftp1,Ansireplacestr(IdHTTP1.URL.URLDecode
(QryDoc.FieldByName('DOCURL').AsString),'
ftp://192.168.0.197:10022
',''))
then
    DBAdvStringGrid1.Cells[2,i]:='<B><FONT face="Tahoma" size="8" 
color="clgreen">ok</FONT></B>'
   else DBAdvStringGrid1.Cells[2,i]:='<B><FONT face="Arial" size="8" 
color="clred">Errore</FONT></B>';
   i:=i+1;
   QryDoc.Next;
  end;
 idFTP1.Disconnect;
 QryDoc.First;
end;


>Questo mi sembra piuttosto ovvio.
... a me no visto che in PHP la fileexist riceve come parametro un URL
verifica ugualmente.
Non volevo di certo scrivere una cavolata mi spiace.


Se dai un ls sul ftp, ti carichi la lista file e poi confronti?
Bye,
Raktzo

>Se dai un ls sul ftp, ti carichi la lista file e poi confronti?
mmm...
Io ho visto che esiste un directorylisting ma non so' come dovrei 
utilizzarlo


 utilizzarlo
il comando ls fa parte del protocollo ftp, non so il tuo componente come lo
trappa, che usi per la connessione ftp?
Potrebbe anche essere che il DirectoryListing carichi il contenuto di una
directory.
Bye,
Raktzo

io ho utilizzato TIDFTP degli INDY clients


verifica ugualmente.
devi vedere, però, se la verifica funziona solo per i
file sul server e dell'host su cui sta girando php.
	Ciao
	MassimoB
 
---------------------------------
http://www.massimobeschi.it/
---------------------------------
Se tu pagare come dici tu ...
Io lavorare come dico io ...
Se tu pagare come dico io ...
Io lavorare come dici tu ...
---------------------------------

> io ho utilizzato TIDFTP degli INDY clients
Prova con DirectoryListing oppure con List
Bye,
Raktzo

Raktzo


io per ottenere la lista file completa ho implementato questa procedura
sembra funzionare a parte la lentezza... magari aggiungendoli un 
applicatin.processingmessage migliorerà
procedure FTPListfile(AFTPCLient:TidFTP;var List:Tstrings;CurDir:string);
var AppD:Tstrings;
    i:integer;
begin
  try
    if not AFTPClient.Connected then //Pas connecté ?
        AFTPClient.Connect(); //On connecte
    except
       Exit; //Impossible de connecter !
  end;
  AppD:=TStringList.Create;
  AFTPClient.ChangeDir(CurDir);
  AFTPClient.List(AppD, '', true);
  for i:=0 to AppD.Count-1 do
   begin
    if MidStr(Appd.Strings[i],25,5)='<DIR>'then
     FTPListfile(AFTPCLient,list,curdir+'/'+midstr(Appd.Strings
[i],40,length(Appd.Strings[i])-39))
    else
     List.add('ftp://'+AFTPClient.host+':'+inttostr(AFTPClient.Port)
+curdir+'/'+midstr(Appd.Strings[i],40,length(Appd.Strings[i])-39));
   end;
  AppD.Free;
end;


applicatin.processingmessage migliorerà
un Application.ProcessMessages non potra fare altro che
rallentare ancora di più la tua procedura anche se
l'applicazione sembrerà sbloccata. Anche su
quest'ultima affermazione avrei qualche dubbio in
quanto i tempi maggiori se li prendono le chiamate FTP
che con la logica Indy sono bloccanti! e quindi è tutto
freezato finchè il server non risponde o va in timeout.


Ma mettendo "blindati" i componenti come gliglia,ecc.. ed una bella 
progressbar magari il piu sgargiante possibile fara si che utente sarą 
piu interessato alla barra che al resto dell'applicazione... non credi?


Il punto è :
"perchè fare n chiamate al server e farsi tornare n risposte (con i
conseguenti tempi di attesa e processo) quando con 1 sola chiamata hai
comunque le n risposte?"
Bye,
Raktzo


Intendi che la lista di tutto la posso ottenere senza chiamare la mia 
procedura? e se si in che modo


Prova con DirectoryListing oppure con List
Bye,
Raktzo