Il ne s'agit pas d'une condition de course par définition, mais il est possible qu'un fichier, partiellement téléchargé, soit ouvert à la lecture par le système A et contienne donc des données invalides. Le système A pourrait vérifier la cohérence du fichier, tester une taille fixe le cas échéant, tester certaines autorisations de fichiers (que vous définissez après le téléchargement) et, dans tous les cas, différer l'ouverture du fichier au cas où les conditions ne seraient pas remplies, en le faisant à la prochaine itération.
Je téléchargerais vers un nom de fichier ou un emplacement temporaire, puis renommerais/déplacerais vers le dossier/extension correct pour votre programme. Par exemple, télécharger vers nomfichier.part puis renommer vers nomfichier.dat ou télécharger vers en attente/nomfichier.dat puis déplacer hors du dossier en attente. Cela résoudra tous ces problèmes. Sur les systèmes UNIX/Linux et Windows, une opération de déplacement (ou de renommage) sera atomique et vous n'obtiendrez jamais un fichier partiel.
Il n'y a pas vraiment de meilleure façon de gérer cela. Vous avez besoin de communiquer au système A que le fichier n'est pas complet et vous n'avez pas de communication inter-processus établie entre les systèmes. Vos options sont d'utiliser un fichier de verrouillage pour empêcher votre programme d'ouvrir le fichier (et de le supprimer plus tard), d'utiliser un fichier temporaire (et ensuite de renommer/déplacer votre fichier au nom approprié), ou de faire une sorte de contrôle d'intégrité (ce qui est probablement un gaspillage de ressources).
Vous pourriez également envisager, en fonction de la fréquence à laquelle cela se produit, de déclencher le Système A à partir du Système B. Si un fichier est présent 99% du temps, la manière que vous proposez déjà (avec un verrou) est probablement la plus efficace. D'un autre côté, si vous ne trouvez des données qu'occasionnellement, cela peut être un gaspillage de ressources (et nécessiter un programme long ou déclenché par cron). Si vous avez SFTP, vous avez peut-être un accès SSH. Dans ce cas, configurez des certificats entre le système (pour éviter le besoin de mots de passe, voir ssh-copy-id) et exécutez une version modifiée de
ssh système_a.votredomaine.com 'processfile /home/utilisateur/data/*.dat' (fichier de traitement)