2009-09-04 12 views
0

J'ai codé ce programme pour télécharger un fichier sur le serveur en utilisant ftpput api il ne fonctionne pas il fonctionne mais le fichier n'est pas délété!Pourquoi mon programme ne télécharge pas de fichier sur un serveur ftp distant?

est ici le code:

unit ftp3; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls,wininet; 

type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 

    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

    {$R *.dfm} 

    procedure TForm1.Button1Click(Sender: TObject); 

     var hInet, hConnect: HINTERNET; 

    local_file, 
    remote_file, 
    user,remote_server, 
    pass: pchar; 

    begin 
    local_file := 'C:\Documents and Settings\Omair\Desktop\loggen.txt'; 
    remote_file := 'loggen.txt'; 
    user := 'my user'; 
    pass := 'my pass'; 
    remote_server := ' ftp.drivehq.com'; 

    hInet := InternetOpen(0, INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0); 
    hConnect := InternetConnect(hInet, 
     remote_server, 
     INTERNET_DEFAULT_FTP_PORT, 
     user, pass, 
     INTERNET_SERVICE_FTP, 
     INTERNET_FLAG_PASSIVE, 
     0); 

    ftpPutFile(hConnect, local_file, remote_file, FTP_TRANSFER_TYPE_BINARY, 0); 

    InternetCloseHandle(hInet); 
    InternetCloseHandle(hConnect); 

    end; 

    end. 
+0

Y a-t-il déjà un fichier "loggen.txt"? Essayez de le retirer en premier. – Havenard

+3

Vérifiez le nom du serveur 'ftp.drivehq.com', a un espace vide. – RRUZ

+0

qu'est-ce que tu veux dire a un espace vide je suis un nouveau à la programmation s'il vous plaît expliquez-moi –

Répondre

2

tout d'abord, des règles sur les erreurs majeures dans votre programme (ou réglez-les, si vous voulez) en vérifiant yo Vous pouvez FTP ce même fichier avec le programme FTP intégré de Microsoft.

A partir de la ligne de commande, tapez

 
FTP ftp.drivehq.com (return)

si cela ne revient pas à vous avec une invite de connexion, vous avez des problèmes en dehors de votre code Delphi. Soit vous avez une connectivité Internet limitée (peut-être le port FTP, le port FTP est bloqué par votre pare-feu/routeur), soit il y a un problème avec l'adresse FTP elle-même.

Si vous recevez une invite, entrez votre nom d'utilisateur et votre mot de passe lorsque vous y êtes invité. Maintenant, tapez

 
BIN (return) 
PUT 'C:\Documents and Settings\Omair\Desktop\loggen.txt' (return)

si cela semble envoyer votre fichier, (type BYE pour quitter le programme FTP, en passant) alors votre problème est avec votre code Delphi plutôt que le processus FTP lui-même (les autres réponses ici ont utilement souligné les choses que vous devez vérifier dans le code Delphi lui-même). Si ça ne semble pas envoyer le fichier, encore une fois je vous suggère de chercher à résoudre ce problème avant de découper votre code Delphi.

 

Quand je fais tout type de travail « en ligne » comme ça, j'essaie toujours d'obtenir un processus distinct pour tester la « autre extrémité » du système, qui n'utilise pas de mon propre code.

+0

j'ai essayé mettre C: \ Documents and Settings \ Omair \ Desktop \ loggen.txt ainsi que mettre C: \ Documents and Settings \ Omair \ Desktop \ loggen.txt [/loggen.txt] en utilisant microsoft comand ligne ftp il a échoué !! cela signifie-t-il quelque chose de mal avec mes fenêtres ftp aussi je étais une fois peaufiner mon code Delphi encore et encore et il téléchargé accidentellement je ne me souviens pas de ce que je l'ai fait que je l'ai expérimenté très fréquemment –

+0

Copiez le fichier à la racine de le lecteur C: \, assurez-vous que l'attribut en lecture seule n'est pas défini, lancez une invite de commande, cd à la racine de votre lecteur c: \ et FTP à partir de là. supprimer tout loggen.txt existant du serveur FTP ('del loggen.txt' je pense, pas de machine Windows à portée de main pour le moment!). Vous n'aurez pas besoin de chemin de fichier dans le nom de fichier, car vous allez à partir de la racine où se trouve le fichier, utilisez simplement loggen.txt comme nom de fichier. Maintenant, voyez ce qui se passe ...? Bonne chance! – robsoft

+0

hey mon code fonctionne maintenant merci! il semble que mon erreur était que j'utilisais un espace vide à savoir 'ftp.drivehq.com' au lieu de 'ftp.drivehq.com' je ne peux pas croire que j'ai fait une telle erreur évidente! –

4

Vérifiez la valeur de retour de FtpPutFile (il devrait revenir TRUE en cas de succès) et d'obtenir une erreur détaillée avec GetLastError.

4

Et pourquoi ne pas essayer un peu plus de voir ce qui se passe par en testant tous les codes de retour pour être sûr de l'endroit où il échoue?

procedure TForm1.Button1Click(Sender: TObject); 
var 
    hInet, hConnect: HINTERNET; 
    local_file, remote_file, user,remote_server, pass: PChar; 
begin 
    local_file := 'C:\Documents and Settings\Omair\Desktop\loggen.txt'; 
    remote_file := 'loggen.txt'; 
    user := 'my user'; 
    pass := 'my pass'; 
    remote_server := ' ftp.drivehq.com'; 

    hInet := InternetOpen(0, INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0); 
    if hInet = nil then 
    RaiseLastOSError; 

    hConnect := InternetConnect(hInet, 
    remote_server, 
    INTERNET_DEFAULT_FTP_PORT, 
    user, pass, 
    INTERNET_SERVICE_FTP, 
    INTERNET_FLAG_PASSIVE, 
    0); 
    if hConnect = nil then 
    RaiseLastOSError; 

    if not ftpPutFile(hConnect, local_file, remote_file, FTP_TRANSFER_TYPE_BINARY, 0) then 
    RaiseLastOSError; 

    if not InternetCloseHandle(hConnect) then 
    RaiseLastOSError; 
    if not InternetCloseHandle(hInet) then 
    RaiseLastOSError; 
end; 

Vous ne savez pas même si vous avez la connexion avant d'essayer d'envoyer le fichier ... (Il est ce que je suis arrivé, comme prévu, lors de l'exécution du code avec ces valeurs site/utilisateur/mot de passe)

Et si vous avez passé, vous pouvez réellement obtenir une explication détaillée des raisons pour lesquelles FtpPutFile échoue, comme dans cet exemple:

System Error. Code: 3. 

The system cannot find the path specified. 
+0

il renvoie le code d'erreur 12002 sur 'sinon ftpPutFile (hConnect, fichier_distant, fichier_distant, FTP_TRANSFER_TYPE_BINARY, 0) puis RaiseLastOSError;' ligne j'ai googlé ce code d'erreur cela signifie "La demande a expiré." et "ERROR_INTERNET_TIMEOUT" s'il vous plaît aider !!!! et désolé j'ai oublié de mentionner que je suis nouveau à la programmation –

+1

@Omair - si vous obtenez des erreurs de délai, essayez l'approche indiquée dans ma réponse pour vérifier que votre système et le site FTP peuvent réellement échanger des informations en premier - le problème peut-être pas dans votre code en tant que tel [bien que vous devriez écrire du code pour gérer correctement ce genre d'erreurs. :-)] – robsoft

Questions connexes