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?
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.
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é.
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.
Les solutions fiables et sûres nécessitent d'améliorer le processus d'écriture.
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.