Bonjour,
j'utilise le composant TNMFTP qui est très simple.
Cependant existe-il une solution pour distinguer fichiers et répertoires, pour par exemple, parcourir en récursif?
Si ce n'est pas possible directement...une piste?
merci
Bonjour,
j'utilise le composant TNMFTP qui est très simple.
Cependant existe-il une solution pour distinguer fichiers et répertoires, pour par exemple, parcourir en récursif?
Si ce n'est pas possible directement...une piste?
merci
Lorsque tu fais un appel à "List" (PAS NList), un événement "OnSuccess" est déclanché avec TCmdType=cmdList (si tu as mis ParseList=true, ce qui est vivement conseillé).
Depuis OnSuccess, tu peux alors consulter tous les fichiers et répertoire grâce à la propriété FTPDirectoryList.
FTPDirectoryList->name->Strings[i] pour le nom de la i_ème entrée
FTPDirectoryList->Size->Strings[i] pour la taille de la i_ème entrée
FTPDirectoryList->ModifDate->Strings[i] pour la date de modif de la i_ème entrée, et
FTPDirectoryList->Attribute->Strings[i] pour les attributs de la i_ème entrée
Les directories ont un attribut "d", ce qui te permet de les distinguer des fichiers
Exemple:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
30
31
32
33
34
35
36
37
38
39 void __fastcall TForm1::FTPSuccess(TCmdType Trans_Type) { if (Trans_Type!=cmdList) return; ListBox1->Clear(); for (int i=0; i<FTP->FTPDirectoryList->name->Count;++i) { // Extract data AnsiString filename=FTP->FTPDirectoryList->name->Strings[i]; AnsiString size=FTP->FTPDirectoryList->Size->Strings[i]; AnsiString date=FTP->FTPDirectoryList->ModifDate->Strings[i]; AnsiString attributes=FTP->FTPDirectoryList->Attribute->Strings[i]; // Apply command to normal files and folders (remove "." and ".." folders) if ((filename!=".")&&(filename!="..")) { if (attributes.Pos("d")>0) { ListBox1->AddItem(filename+" est un répertoire",0); } else if (attributes.Pos("l")>0) { ListBox1->AddItem(filename+" est un lien (raccourcis)",0); } else { ListBox1->AddItem(filename+" est un fichier",0); } } } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { FTP->Connect(); FTP->List(); FTP->Disconnect(); }
yes, excellent....
je devrais me débrouiller avec ça.
merchi
Salut,
Il se peut que dans le répertoire du serveur il y ait des liens vers des sous-répertoires ou vers des fichiers. Dans ce cas, l'attribut FTPDirectoryList->Attribute contient un 'l' mais pas de 'd', et rien ne permet de savoir si l'élément est un répertoire ou un fichier. Dans cette hypothèse, une seule solution : repérer tous les FTPDirectoryList->Attribute qui commencent par 'l' et tenter un ChangeDir(). Si le ChangeDir() échoue c'est un fichier... sinon un sous-répertoire.
Partager