2010-03-29 11 views
1

Je souhaite télécharger un fichier sur un serveur ftp par programmation (C++). Si la connexion est perdue lors du téléchargement d'un fichier, je ne voudrais pas télécharger le fichier à partir de zéro, mais télécharger uniquement la partie que je n'ai pas envoyée.Utilisation de la commande FTP "append"

La commande APPE répond-elle à ma demande? Quelle liste de commandes FTP dois-je utiliser exactement? Et comment?

Répondre

5

Vérifiez la RFC et plus précisément la commande APPEND:

Cette commande provoque le serveur DTP accepte les données transférées via la connexion de données et pour stocker les données dans un fichier sur le serveur site. Si le fichier spécifié dans le chemin existe sur le site du serveur, les données doivent être ajoutées à ce fichier; sinon le fichier spécifié dans le chemin d'accès doit être créé sur le site du serveur .

Notez que vous ne pouvez pas simplement APPENDER le même fichier à nouveau. Vous devriez envoyer les octets restants. Autrement dit, continuer à la même position lorsque la connexion a été perdue.

5

Je google des détails sur la commande FTP APPE, ce qui en fait, mais la plupart du site juste état seulement append. Ensuite, j'essaie la commande pour m'assurer qu'elle se comporte comme prévu.

Je conçois un expéditeur automatique FTP qui est utilisé pour envoyer un fichier journal d'une machine à un serveur pour la création de rapports. Je veux seulement envoyer la dernière ligne du fichier journal.

Lors de l'utilisation d'une commande APPE, elle ajoute en fait tout le contenu du fichier et l'ajoute à l'existant dans le serveur. Cela entraînera l'entrée de ligne en double.

La réponse: Pour faire le curriculum vitae du fichier si le dernier transfert a échoué, il n'y a pas de commande pour cela, mais nous avons besoin d'utiliser une séquence de commande pour y parvenir.

Le point clé ici est de rechercher votre fichier local sur le dernier octet téléchargé si vous utilisez la commande APPE ou en utilisant la commande REST. REST commencera le transfert sur cette position de début d'octet particulière. Je fin avec cette solution pour effectuer après la connexion établie:

Utilisez APPE (j'ai eu l'idée de journal FileZilla):

  1. Utiliser la taille pour vérifier le fichier existe et Utilisez-le comme marqueur de reprise.
  2. Ouvrir le système de fichiers local et rechercher sur le marqueur.
  3. Utilisez APPE pour télécharger et le serveur FTP l'ajoutera automatiquement.

Utilisez STOR REST (j'eu l'idée de edtFTPnet):

  1. Utiliser la taille pour vérifier le fichier existe et l'utiliser comme marqueur de reprise.
  2. Envoyer REST avec le résultat que vous obtenez de TAILLE pour dire au serveur FTP de commencer à écrire sur la position.
  3. Ouvrir le système de fichiers local et rechercher sur le marqueur.
  4. Utilisez STOR comme téléchargement normal.

Notez que tous les serveurs FTP ne prennent pas en charge les deux méthodes. Je vois FileZilla basculer de cette façon en fonction du serveur. Mon observation montre que l'utilisation de REST est la méthode standard. Le téléchargement peut également utiliser REST pour commencer le téléchargement sur la position d'octet donnée. N'oubliez pas que l'utilisation de la prise en charge de reprise pour le type de transfert ASCII produira un résultat inattendu, car Unix et Windows ont un nombre d'octets de rupture de ligne différent. Essayez de manipuler FileZilla pour voir le comportement dans le journal. Vous pouvez également consulter cette utile FTP open source pour bibliothèque .NET sur la façon dont ils le font. edtFTPnet