web-dev-qa-db-fra.com

Comment savoir si le fichier est complet sur le serveur via FTP?

J'ai une application d'analyse de fichiers en Java, qui continue de numériser un répertoire sur un serveur via FTP. obtient la liste des fichiers du répertoire et les télécharge un par un. de l'autre côté, sur le serveur, il y a un processus qui écrit ces fichiers. si j'ai de la chance, je n'essaierais pas de télécharger un fichier incomplet, mais comment puis-je m'assurer que le processus d'écriture sur le serveur est terminé et que le descripteur de fichier est fermé et que le fichier est prêt à être téléchargé?

Je n'ai aucun contrôle sur le processus d'écriture qui se trouve sur le serveur. de plus, je n'ai pas la permission d'écrire sur le répertoire pour essayer d'obtenir un handle d'écriture afin de vérifier s'il y a déjà un handle d'écriture ouvert, donc cette option est hors de la table.

Existe-t-il une fonction FTP pour résoudre ce problème?

22
mostafa.S

Il s'agit d'un problème très ancien et bien connu.

Il n'y a aucun moyen d'être absolument certain qu'un fichier en cours d'écriture par le démon FTP est complet. Il est même possible que le transfert de fichiers ait échoué, puis soit redémarré et terminé. Vous devez interroger la taille du fichier et définir une limite de temps, disons 5 minutes. Si la taille ne change pas pendant cette période, vous supposez que le fichier est complet.

Si possible, le programme qui traite le fichier doit pouvoir traiter les fichiers partiels.

Une bien meilleure alternative est rsync, qui est beaucoup plus robuste et déterministe. Il peut même être configuré (via l'option de ligne de commande) pour écrire les données initialement dans un emplacement temporaire et les déplacer vers leur chemin de destination finale une fois terminé. Si le fichier existe là où vous l'attendez, il est par définition complet.

22
Jim Garrison

Une solution possible serait de télécharger d'abord le fichier avec un nom de fichier différent (par exemple en ajoutant ".partial") puis de le renommer en son nom final.

Si le serveur trouve le nom final, le téléchargement est terminé.

Si vous ne pouvez pas contrôler le processus de téléchargement, alors ce que vous demandez est impossible par définition: le téléchargement de fichier peut s'arrêter en raison d'un problème de réseau ou parce que le processus d'envoi est arrêté pour une raison quelconque.

Ce que l'extrémité réceptrice observera n'est qu'une fermeture du flux entrant; il n'y a aucun moyen de garantir que les données ne seront pas un transfert partiel.

D'autres solutions de contournement pourraient être de rechercher un marqueur de fin de données ou d'utiliser une demande adressée au serveur d'envoi pour vérifier si (à leur avis) le transfert a été effectué.

12
6502

C'est plus fondamental que FTP: vous auriez un problème similaire à lire ces fichiers même s'ils étaient créés sur la machine locale.

Si vous ne pouvez pas modifier le processus d'écriture, vous devrez sauter à travers certains cercles. Aucun n'est génial, mais certains sont plus sûrs que d'autres.

  • Continuez à lire jusqu'à ce que rien ne change pour une fenêtre (peut-être une minute, comme le suggère David Schwartz). Vous pouvez optimiser cela un peu en regardant la taille du fichier.
  • Déterminez si les fichiers sont écrits en série dans un ordre fiable. Lorsque vous voyez le fichier N apparaître, vous savez que le fichier N-1 est prêt. (Suppose que le répertoire est vide avant que les fichiers ne soient écrits, bien que vous puissiez également regarder les horodatages.) L'inconvénient est que votre logique se brisera si l'écrivain change un jour d'ordre ou commence à écrire en parallèle.

Les solutions fiables et sûres nécessitent d'améliorer le processus d'écriture.

  • Writer peut écrire les fichiers dans des emplacements cachés ou temporaires et les rendre visibles uniquement une fois que le fichier entier (ou le répertoire) est prêt, en utilisant des liens symboliques ou le déplacement de fichiers ou chmod.
  • Writer crée un fichier spécial (par exemple, "./DONE") uniquement après que tous les autres fichiers ont été écrits et le lecteur ne lit aucun fichier tant que ce fichier n'est pas présent.
  • Selon le type de fichier, le rédacteur peut ajouter une sorte d'enregistrement/ligne de fin de fichier à la fin du fichier, et le lecteur peut s'assurer qu'il est présent.
7
dbort

Vous pouvez utiliser la bibliothèque Ftp de l'API commune Apache obtenir plus d'informations

 boolean flag = retrieveFile(String remote, OutputStream local);

Ce flux de sortie de vérification d'indicateur est disponible pour le fichier actuel.

0
Mohammod Hossain