ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Librairie (Library) FTP pour .NET ecrite en C# mais utilisable aussi en VB.NET, dll   



L'auteur

Olivier Hamou
France France
Membre Simple
# 0000000017
enregistré le 13/10/2004
http://www.planitron.com
Hamou Olivier
94100 Saint Maur des fossés
de la société PLANITRON
Fiche personnelle


Note des membres
20/20
1 vote


Contributions > 80 dotnet > 01 C#

Librairie (Library) FTP pour .NET ecrite en C# mais utilisable aussi en VB.NET, dll
# 0000000787
ajouté le 14/03/2011 19:48:24 et modifié le 20/03/2011
consulté 11136 fois
Niveau débutant


Le téléchargement des pièces jointes est limité aux membres
Veuillez vous identifier ou vous inscrire si vous n'avez pas encore de compte ...
Description
LIBRAIRIE que j'ai écrite en C# pour faire des commandes FTP envoyer, downloader pour .NET et etc...

C'est utilisable aussi avec le langage VB.NET
Code source :
  Ftp oFTP         = new Ftp();
 //oFTP.nPort     = 21; // default is 21
  oFTP.bUsePassive = true;
  oFTP.cUrl        = "ftp.mydomain.com";
  oFTP.cLogin      = "MyLogin";
  oFTP.cPassword   = "Password";
  if (oFTP.login()) {
     HttpContext.Current.Response.Write("login : "+oFTP.cStatusDescription);
     oFTP.upload("C:\\MyDirectory\\File.zip","File_Remote.zip");
  } else {
     HttpContext.Current.Response.Write("login : error login");
  }

  oFTP.close();
  oFTP     = null;
Commentaires
le 23/03/2011, eric leissler a écrit :
Salut Olivier
avec .net tu as aussi
'My.Computer.Network.UploadFile(lefichier_a_uploader, HOSTNAME+CHEMINSURLESERVEURETNOMDUFICHIER,LOGIN,motdepasse, True, 100, FileIO.UICancelOption.DoNothing)

et my.comuteur.network.donwload qui fonctionne de la même manière
J'ai mis un exemple sur www.strataframe.fr

@+
Cordialement
Eric

le 23/03/2011, Olivier Hamou a écrit :
Salut Eric,

Je connaissais pas cette methode, mais dans ma librairie, je peux aussi renommer, effacer, tester si le fichier existe, obtenir la taille, recuperer la liste de tous les fichiers.

Est ce qu'avec ton objet on peut faire pareil ? car j'ai galéré il y a 1 an ou 2 ans pour faire cette librairie.

@ très bientot

le 11/12/2013, medins2001 a écrit :
Bonjour à tous,

Je veux exploiter cette Library, Y a t-il un petit code en VFP 9 ?

Merci d'avance

le 11/12/2013, Olivier Hamou a écrit :
Bonjour Medins

C'est uniquement utilisable pour .NET pour la version Vfp c'est par ici :

http://www.atoutfox.org/articles.asp?ACTION=FCONSULTER&ID=0000000292

le 11/12/2013, medins2001 a écrit :
Merci Olivier Hamou pour la réponse,

j'ai déjà utilisé cette classe et la classe FTP de BAUDOUIN Anatole, et quand je fais un appel à la méthode "Fichiers2Array" il me renvoi toujours 0 (c'est comme si le dossier est vide. par contre il y a des fichiers sur mon serveur ftp et la connexion est bien établi)

Merci d'avance

le 11/12/2013, Olivier Hamou a écrit :
Est ce que tu es dans le bon répertoire ?

testes en utilisant ChangeRepertoire

J'ai amélioré la classe d'anatole , corrigeant la fermeture d'un handle,
en rajoutant, un thermoetre et aussi en créant une function Ftp2Cursor
et en ajoutant un parametre pour les ftp passive ou non !


La voici :



*--------------------------------------------------------------------------*
* FTP
* Classe pour le transfert FTP
* Auteur : BAUDOUIN Anatole
* Modifié : HAMOU Olivier
* DATE MODIF : 13/11/2011 19:29:00
* 05/04/2011 15:34:00 rajout du mode passive
* 13/11/2011 19:29:00 modifié le destroy pour tester le this.mOPen
* Erreur pour les fichiers thermometre resolu
*--------------------------------------------------------------------------*
#DEFINE INTERNET_INVALID_PORT_NUMBER 0
#DEFINE INTERNET_OPEN_TYPE_DIRECT 1
#DEFINE INTERNET_SERVICE_FTP 1
#DEFINE FTP_TRANSFER_TYPE_ASCII 1
#DEFINE FTP_TRANSFER_TYPE_BINARY 2
#DEFINE INTERNET_FLAG_NEED_FILE 16

*
* File Attributes
*
#DEFINE FILE_ATTRIBUTE_READONLY 1
#DEFINE FILE_ATTRIBUTE_HIDDEN 2
#DEFINE FILE_ATTRIBUTE_SYSTEM 4
#DEFINE FILE_ATTRIBUTE_DIRECTORY 16
#DEFINE FILE_ATTRIBUTE_ARCHIVE 32
#DEFINE FILE_ATTRIBUTE_ENCRYPTED 64
#DEFINE FILE_ATTRIBUTE_NORMAL 128
#DEFINE FILE_ATTRIBUTE_TEMPORARY 256
#DEFINE FILE_ATTRIBUTE_SPARSE_FILE 512
#DEFINE FILE_ATTRIBUTE_REPARSE_POINT 1024
#DEFINE FILE_ATTRIBUTE_COMPRESSED 2048
#DEFINE FILE_ATTRIBUTE_OFFLINE 4096

#DEFINE GENERIC_READ 2147483648 && &H80000000
#DEFINE GENERIC_WRITE 1073741824 && &H40000000

#DEFINE INTERNET_FLAG_PASSIVE 0x08000000
#define FTPBUFSIZ_GET (32*1024) && ou 4 * 1024, comme tu veux


Define class FTP as custom

mOpen = null && handle de l'ouverture internet
mConnect = null && handle de connexion au serveur FTP

*--------------------------------------------------------------------------*
procedure init()

declare integer InternetOpen in wininet;
string sAgent,;
integer lAccessType,;
string sProxyName,;
string sProxyBypass,;
string lFlags

declare integer InternetCloseHandle in wininet;
integer hInet

declare integer InternetConnect in wininet;
integer hInternetSession,;
string sServerName,;
integer nServerPort,;
string sUsername,;
string sPassword,;
integer lService,;
integer lFlags,;
integer lContext

declare integer FtpFindFirstFile in wininet;
integer hFtpSession,;
string lpszSearchFile,;
string @lpFindFileData,;
integer dwFlags,;
integer dwContent

declare integer InternetFindNextFile in wininet;
integer hFind,;
string @lpvFindData

declare integer FtpGetCurrentDirectory in wininet;
integer hFtpSession,;
string @lpszDirectory,;
integer @lpdwCurrentDirectory

declare integer FtpSetCurrentDirectory in wininet;
integer hFtpSession,;
string @lpszDirectory

declare integer FtpOpenFile in wininet;
integer hFtpSession,;
string sFileName,;
integer lAccess,;
integer lFlags,;
integer lContext

declare integer InternetReadFile in wininet;
integer hFile,;
string @lpBuffer,;
integer dwNumberOfBytesToRead,;
integer @lpdwNumberOfBytesRead

declare integer InternetWriteFile in wininet;
integer hFile,;
string @lpBuffer,;
integer dwNumberOfBytesToWrite,;
integer @lpdwNumberOfBytesWritten


declare integer FtpGetFile in wininet;
integer hFtpSession,;
string lpszRemoteFile,;
string lpszNewFile,;
integer fFailIfExists,;
integer dwFlagsAndAttributes,;
integer dwFlags,;
integer dwContext

declare integer FtpPutFile in wininet;
integer hConnect,;
string lpszLocalFile,;
string lpszNewRemoteFile,;
integer dwFlags,;
integer dwContext

declare integer FtpDeleteFile in wininet;
integer hConnect,;
string lpszFileName

declare integer FtpCreateDirectory in wininet;
integer hFtpSession,;
string lpszDirectory

declare integer FtpRemoveDirectory in wininet;
integer hFtpSession,;
string lpszDirectory

declare integer FtpGetFileSize in wininet;
integer hFile,;
integer @ lpdwFileSizeHigh

declare integer FtpRenameFile in wininet;
integer hFtpSession,;
string lpdzExisting,;
string lpdzNew

declare integer FileTimeToSystemTime in kernel32;
string @lpFileTime,;
string @lpSystemTime

Endproc && init

*--------------------------------------------------------------------------*
*---> Se connecte au serveur FTP
Procedure Connexion(strHost, strUser, strPwd, lModePasv)
m.lModePasv = Iif((VarType(m.lModePasv) $ "U-X") .or. Empty(lModePasv) ,.F.,m.lModePasv)
with this
.mOpen = InternetOpen ("vfp", INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0)
If .mOpen = 0
return .F.
Endif

m.nFlags = iif(m.lModePasv,INTERNET_FLAG_PASSIVE,0)
.mConnect = InternetConnect(.mOpen, strHost,;
INTERNET_INVALID_PORT_NUMBER,;
strUser, strPwd, INTERNET_SERVICE_FTP, m.nFlags, 0)

if .mConnect = 0
= InternetCloseHandle (.mOpen)
return .F.
Endif
return .T.
Endwith
Endproc && Connect

*--------------------------------------------------------------------------*
*---> Fermeture de la connexion à la desctruction de l'objet
procedure destroy()
&&Messagebox(this.mOpen)
&& Erreur car on ne testait pas si InternetOpen etait ouvert.
if this.mOpen > 0
= InternetCloseHandle(this.mOpen)
EndIF
endproc && destroy

*--------------------------------------------------------------------------*
*---> Renvoie le répertoire courant
procedure RepertoireCourant() as string
local v_directory, v_len
v_directory = space(250)
v_len = len(v_directory)
if FtpGetCurrentDirectory (this.mConnect, @v_directory, @v_len) = 1
return left(v_directory, v_len)
else
return ""
endif
endproc

*--------------------------------------------------------------------------*
procedure ChangeRepertoire(p_dir as String) as Boolean
return FtpSetCurrentDirectory(this.mConnect, p_dir) > 0
endproc && ChangeRepertoire

*--------------------------------------------------------------------------*
*---> Envoie un fichier sur le serveur
procedure EnvoyerFichier(p_local as string ,;
p_remote as string) as Boolean

return FtpPutFile(this.mConnect, p_local, p_remote, FTP_TRANSFER_TYPE_BINARY, 0) > 0
endproc && EnvoyerFichier

*--------------------------------------------------------------------------*
*---> Télécharge un fichier sur le serveur
procedure PrendreFichier(p_remote as string ,;
p_local as string) as Boolean
return FtpGetFile(this.mConnect ,;
p_remote ,;
p_local ,;
1 ,; && échec si existe en local
FILE_ATTRIBUTE_DIRECTORY ,;
FTP_TRANSFER_TYPE_BINARY ,;
0) > 0
endproc && PrendreFichier


*--------------------------------------------------------------------------*
*---> Télécharge un fichier sur le serveur Avec affichage d'un thermo
*--------------------------------------------------------------------------*
Procedure PrendreFichier_Thermo(p_remote, p_local, oFTP)
LOCAL VAL_RETOUR as Boolean, oFORM as Form
Local Success as Boolean,BytesRead as Integer,n as Integer, Sts as Integer

M.VAL_RETOUR = .F.
gnFichierErreur = 0
IF FILE(p_local) && Le fichier existe-t-il?
gnFichierErreur = FOPEN(p_local,12) && Si oui, ouvrir en lecture/écritur
ELSE
gnFichierErreur = FCREATE(p_local) && Si non, le créer
ENDIF
IF gnFichierErreur < 0 && Recherche les erreurs à l'ouverture du fichier
WAIT "Impossible d'ouvrir ou de créer le fichier de sortie" WINDOW NOWAIT
ELSE && S'il n'y a pas d'erreur, écrire dans le fichier
fd_ftp = oFTP.OuvrirFichier(p_remote,.F.) && Surtout garder faux comme parametre
taillefic = FtpGetFileSize(fd_ftp , .F.)

M.Success = .T.
buf = space(FTPBUFSIZ_GET) && tu peux mettre cette ligne et la suivante avant le do while
BytesRead = 0
n = 0
sts = 0

oFORM = NewObject("FORM_THERMO","CLASS_FTP.VCX")
oFORM.Visible = .T.
oFORM.Init("Réception du fichier "+p_remote+" vers " +p_local)
INKEY(0.001,"H") && ON FAIT CETTE ATTENTE POUR VISIONNER LA FENETRE PROPREMENT

Do while m.Success
sts = InternetReadFile(fd_ftp, @m.Buf, FTPBUFSIZ_GET, @m.BytesRead)

do case
case Empty(m.sts)
assert .F.
Success = .F.
case empty(m.BytesRead)
exit
otherwise
n = m.n + m.BytesRead
EndCase
oFORM.alim_ecran(n, taillefic)
M.VAL_RETOUR = .T.
* messagebox(alltrim(str(m.n)))

Do case
case !m.Success
case Fwrite(gnFichierErreur , m.buf, m.BytesRead) <> m.BytesRead
=MessageBox('local Write error', 16, m.this.Class)
Success = .F.
Endcase
EndDo
oFORM.release()
oFORM = null
RELEASE oFORM
ENDIF
&& on ferme le fichier
InternetCloseHandle(m.fd_ftp)

=FCLOSE(gnFichierErreur) && Ferme le fichier
Return M.VAL_RETOUR
EndPROC &&PrendreFichier_Thermo

*--------------------------------------------------------------------------*
*---> Envoit un fichier sur le serveur Avec affichage d'un thermo
*--------------------------------------------------------------------------*
Procedure EnvoyerFichier_Thermo(p_local ,p_remote ,oFTP)
Local gnDescripteurFichier,nTaille,cchaine
LOCAL VAL_RETOUR as Boolean, oFORM as Form
M.VAL_RETOUR = .T.

m.gnDescripteurFichier = FOPEN(p_local)
m.fd_ftp = oFTP.OuvrirFichier(p_remote,.t.)

* Recherche la fin du fichier pour déterminer le nombre d'octets contenu dans le fichier
nTaille = FSEEK(m.gnDescripteurFichier, 0, 2) && Déplace le pointeur à EOF
IF nTaille <= 0
* Si le fichier est vide, affiche un message d'erreur
WAIT WINDOW "Ce fichier est vide!" NOWAIT
M.VAL_RETOUR = .F.
ELSE
* Si le fichier n'est pas vide, le programme stocke son contenu
* en mémoire, puis affiche le texte dans la fenêtre principale de Visual FoxPro
&&= FSEEK(m.gnDescripteurFichier, 0, 0) && Déplace le pointeur à BOF
&& Attention Faire un FREAD d'un long fichier cela plante
&& Ne sert plus à rien ici.
&&cchaine = FREAD(m.gnDescripteurFichier, nTaille)
ENDIF
= FCLOSE(m.gnDescripteurFichier)
IF M.VAL_RETOUR = .F.
RETURN M.VAL_RETOUR
EndIF
*----
# define FTPBUFSIZ_PUT (32*1024)

m.fd = fopen(p_local)
m.BytesWritten = 0

m.oFORM = NewObject("FORM_THERMO","CLASS_FTP.VCX")
m.oFORM.Visible = .T.
m.oFORM.Init("Envoi du fichier "+p_remote+" vers " +p_local)

*DO FORM ATTENTEMISEAJOUR.scx with "Envoi du fichier "+p_remote+" vers " +p_local
INKEY(0.001,"H") && ON FAIT CETTE ATTENTE POUR VISIONNER LA FENETRE PROPREMENT

*!* buf = space(FTPBUFSIZ) && tu peux mettre cette ligne et la suivante avant le do while
m.BytesRead = 0
m.n=0
Do while !feof(m.fd) and M.VAL_RETOUR
buf = fread(m.fd, FTPBUFSIZ_PUT)
Do case
case empty(InternetWriteFile(m.fd_ftp, @m.buf, len(m.buf), @m.BytesWritten))
*=m.this.Error_Show()
assert .f.
M.VAL_RETOUR = .F.

case m.BytesWritten <> len(m.buf)
=MessageBox('remote Write error', MB_ICONSTOP, m.this.Class)
assert .f.
M.VAL_RETOUR = .F.

otherwise
m.n = m.n + m.BytesWritten
m.oFORM.alim_ecran(m.n,m.ntaille)
M.VAL_RETOUR = .T.
EndCase
Enddo
= empty(m.fd_ftp) or !empty(InternetCloseHandle(m.fd_ftp))
= (m.fd < 0) or fclose(m.fd)

m.oFORM.Release()
m.oFORM = null
RELEASE m.oFORM

return M.VAL_RETOUR
EndPROC && EnvoyerFichier_Thermo

*--------------------------------------------------------------------------*
*---> Ouvre un fichier sur le serveur en renvoie un pointeur
procedure OuvrirFichier(p_remote, JeVoudraisEcrire)
Local GENERIC as INTEGER
M.GENERIC = 0
M.GENERIC = iif(m.JeVoudraisEcrire, GENERIC_WRITE, GENERIC_READ)
Return FtpOpenFile(this.mConnect, p_remote, M.GENERIC, FTP_TRANSFER_TYPE_BINARY, 0)
endproc && OuvrirFichier

&& Ancienne procedure d'anatole Modifié pour afficher le thermometre
*!* *--------------------------------------------------------------------------*
*!* *---> Ouvre un fichier sur le serveur en renvoie un pointeur
*!* procedure OuvrirFichier(p_remote as String) as Integer
*!* return FtpOpenFile(this.mConnect, p_remote, GENERIC_READ, FTP_TRANSFER_TYPE_BINARY, 0)
*!* endproc && OuvrirFichier

*--------------------------------------------------------------------------*
*---> Retourne la taille en octet d'un fichier sur le serveur
procedure TailleFichier(p_remote as String) as Integer
local v_hinternet
v_hinternet = OuvrirFichier(p_remote)
return FtpGetFileSize(v_hinternet, .F.)
endproc && TailleFichier

*--------------------------------------------------------------------------*
*---> Créer un répertoire sur le serveur
procedure CreerRepertoire(p_dir as String) as Boolean
return FtpCreateDirectory(this.mConnect, p_dir) > 0
endproc && CreerRepertoire

*--------------------------------------------------------------------------*
*---> Supprime un fichier sur le serveur
procedure SupprimerFichier(p_remote as String) as Boolean
return FtpDeleteFile(this.mConnect, p_remote) > 0
endproc && SupprimerFichier

*--------------------------------------------------------------------------*
*---> Supprime un répertoire sur le serveur
procedure SupprimerRepertoire(p_dir as String) as Boolean
return FtpRemoveDirectory(this.mConnect, p_dir) > 0
endproc && SupprimerRepertoire

*--------------------------------------------------------------------------*
*---> Renomme un fichier sur le serveur
procedure RenommerFichier(p_old as String ,;
p_new as String) as Boolean
return FtpRenameFile(this.mConnect, p_old, p_new) > 0
endproc && RenommerFichier

*--------------------------------------------------------------------------*
*---> Renvoie .T. si le fichier existe sur le serveur
procedure EstFichier(p_remote as String) as Boolean
return this.OuvrirFichier(p_remote) > 0
endproc && EstFichier

*--------------------------------------------------------------------------*
*---> Extrait la liste des objets dans le masque
* ex de masque : /*.*
*
*---> Colonnes
* 1 : nom du fichier string
* 2 : taille integer
* 3 : dernière modif. datetime
* 4 : attributs integer
*
*---> Attributs :
* 0 Normal Fichier normal. Aucun attribut n'est défini.
* 1 ReadOnly Fichier en lecture seule. L'attribut est lecture/écriture.
* 2 Hidden Fichier caché. L'attribut est lecture/écriture.
* 4 System Fichier système. L'attribut est lecture/écriture.
* 8 Volume Étiquette de volume de lecteur de disque. L'attribut est lecture seule.
* 16 Directory Dossier ou répertoire. L'attribut est lecture seule.
* 32 Archive Le fichier a été modifié depuis la dernière sauvegarde. L'attribut est lecture/écriture.
* 64 Alias Lien ou raccourci. L'attribut est lecture seule.
* 128 Compressed Fichier compressé. L'attribut est lecture seule.
procedure Fichiers2Array(p_masque as String ,;
p_t as String @) as Integer
local v_fichier, v_i, v_find
with this
v_i = 0
v_trame = replicate(chr(0), 320)
v_find = FtpFindFirstFile (.mConnect, p_masque, @v_trame, INTERNET_FLAG_NEED_FILE, 0)
if v_find > 0
do while .T.
v_i = v_i + 1
dimension p_t(v_i, 4)
p_t[v_i, 1] = ltrim(substr(v_trame, 45, 250))
if at(chr(0), p_t[v_i, 1]) <> 0
p_t[v_i, 1] = substr(p_t[v_i, 1], 1, at(chr(0), p_t[v_i, 1])-1)
endif
p_t[v_i, 2] = .buf2num(v_trame, 32, 4)
p_t[v_i, 3] = .ftime2dtime(substr(v_trame, 21, 8))
p_t[v_i, 4] = .buf2num(v_trame, 0, 4)
v_trame = replicate(chr(0), 320)
if InternetFindNextFile (v_find, @v_trame) <> 1
exit
endif
enddo
endif
return v_i
endwith
endproc && PremierFichier


*!=============================================================!
*! Proc Qui liste les fichiers d'un repertoire par ftp dans un cursor
*! Prend en parametre le chemin distant des fichiers avec le masque.
*! Ainsi que le nom du Cursor
*!=============================================================!
Function Fichiers2Cursor
LParameters PATH_FIC, CursorName, CORRIGE_DATEUNIX
Local oFtp as ftp, VAL_RETOUR as Boolean
Local tab_jpg(1,1)
M.VAL_RETOUR = .T.
m.CORRIGE_DATEUNIX = Iif((Empty(m.CORRIGE_DATEUNIX) .or. VarType(m.CORRIGE_DATEUNIX)$"X-U"),.F.,m.CORRIGE_DATEUNIX)
m.CursorName = Iif(Empty(m.CursorName),"LST_FIC",Alltr(m.CursorName))
Create Cursor LST_FIC (FIC_NAME C(200),FIC_DATE T, FIC_SIZE N(20), FIC_TYPE C(1) , FIC_DELETE L)
INDEX ON FIC_DELETE TAG FIC_DELETE BINARY ADDITIVE
INDEX ON SUBSTR(FIC_NAME,1,30) TAG FIC_NAME ASCENDING ADDITIVE

This.Fichiers2Array(Alltr(PATH_FIC),@TAB_JPG)
IF alen(TAB_JPG,1)>1
For i=1 To alen(TAB_JPG,1)
Select LST_FIC
Append Blank
Replace LST_FIC.FIC_NAME with alltr(upper(TAB_JPG(i,1))) && Pour la bonne recherche Collate Machine
Replace LST_FIC.FIC_SIZE with TAB_JPG(i,2)
IF M.CORRIGE_DATEUNIX
Replace LST_FIC.FIC_DATE with CORRECT_DATE_UNIX(TAB_JPG(i,3))
Else
Replace LST_FIC.FIC_DATE with TAB_JPG(i,3)
EndIF
EndFOr
Select LST_FIC
GO TOP
REPLACE ALL LST_FIC.FIC_DELETE WITH .T.
GO TOP IN LST_FIC
Else
VAL_RETOUR = .F.
EndIF
EndFUNC

*--------------------------------------------------------------------------*
hidden procedure buf2num(lcBuffer, lnOffset, lnBytes)
local ii
lnResult = 0
FOR ii=1 TO lnBytes
lnResult = lnResult +;
BitLShift(Asc(SUBSTR (lcBuffer, lnOffset+ii, 1)), (ii-1)*8)
ENDFOR
RETURN lnResult
endproc && bug2num

*--------------------------------------------------------------------------*
hidden procedure ftime2dtime(lcFileTime)
local lcSystemTime, ltResult, lcDate, lcTime, wYear, wMonth, wDay, wHour, wMinute, wSecond, lcStoredSet
lcSystemTime = REPLI (Chr(0), 16)
= FileTimeToSystemTime (@lcFileTime, @lcSystemTime)
wYear = .buf2num(lcSystemTime, 0, 2)
wMonth = .buf2num(lcSystemTime, 2, 2)
wDay = .buf2num(lcSystemTime, 6, 2)
wHour = .buf2num(lcSystemTime, 8, 2)
wMinute = .buf2num(lcSystemTime, 10, 2)
wSecond = .buf2num(lcSystemTime, 12, 2)
lcStoredSet = SET ("DATE")
SET DATE TO MDY
lcDate = STRTRAN (STR(wMonth,2) + "/" +;
STR(wDay,2) + "/" + STR(wYear,4), " ","0")
lcTime = STRTRAN (STR(wHour,2) + ":" +;
STR(wMinute,2) + ":" + STR(wSecond,2), " ","0")
ltResult = ctot(lcDate + " " + lcTime)
set date to &lcStoredSet
RETURN ltResult
endproc && ftime2dtime

enddefine && FPT

le 28/05/2015, taherkefi a écrit :
Bonsoir excusez moi j'ai essayé votre programme mais il n'est pas fonctionnel y'a t'il des modifications a faire pour vfp 9.0 ??? merci.
le 29/05/2015, Olivier Hamou a écrit :
Bonjour ,

Pouvez vous me donner votre code mais m'ecrire sur le forum atoutfox voir lien au dessus,
et je vous dirais pourquoi votre code ne fonctionne pas.
Dans mon exemple :c'est pour l'utiliser avec microsoft .NET
pour la version Vfp c'est par ici :

http://www.atoutfox.org/articles.asp?ACTION=FCONSULTER&ID=0000000292

le 29/05/2015, taherkefi a écrit :
Bonjour,
j ai essayé ce lien mais il n'est pas fonctionnel lorsque je l'ai téléchargé je l’exécute rien qui se passe merci :)

le 29/05/2015, Olivier Hamou a écrit :
Bonjour

Ecrivez vous votre code ici http://www.atoutfox.org/nntp.asp
et on vous aidera.

la classe au dessus , de anatole baudoin doit etre ajouté dans le set procedure to dans le main.prg et vous pouvez après faire appel à votre Objet Ftp dans l'appli

le 29/05/2015, taherkefi a écrit :
Bonjour,

Je viens de mettre mon code dans le lien merci beaucoup.


www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2024.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3